Merge pull request #266 from bsinno/Feature_Improve_Code_Quality

Improve code quality
This commit is contained in:
Michael Hirsch
2016-08-10 08:07:51 +02:00
committed by GitHub
136 changed files with 1268 additions and 1288 deletions

0
3rd-dependencies/listDeps.sh Normal file → Executable file
View File

View File

@@ -118,6 +118,16 @@ public class DeviceSimulatorUpdater {
} }
private static final class DeviceSimulatorUpdateThread implements Runnable { private static final class DeviceSimulatorUpdateThread implements Runnable {
/**
*
*/
private static final String BUT_GOT_LOG_MESSAGE = " but got: ";
/**
*
*/
private static final String DOWNLOAD_LOG_MESSAGE = "Download ";
private static final int MINIMUM_TOKENLENGTH_FOR_HINT = 6; private static final int MINIMUM_TOKENLENGTH_FOR_HINT = 6;
private static final Random rndSleep = new SecureRandom(); private static final Random rndSleep = new SecureRandom();
@@ -187,7 +197,7 @@ public class DeviceSimulatorUpdater {
return result; return result;
} }
private boolean isErrorResponse(final UpdateStatus status) { private static boolean isErrorResponse(final UpdateStatus status) {
if (status == null) { if (status == null) {
return false; return false;
} }
@@ -212,60 +222,73 @@ public class DeviceSimulatorUpdater {
LOGGER.debug("Downloading {} with token {}, expected sha1 hash {} and size {}", url, LOGGER.debug("Downloading {} with token {}, expected sha1 hash {} and size {}", url,
hideTokenDetails(targetToken), sha1Hash, size); hideTokenDetails(targetToken), sha1Hash, size);
long overallread = 0;
try { try {
final CloseableHttpClient httpclient = createHttpClientThatAcceptsAllServerCerts(); return readAndCheckDownloadUrl(url, targetToken, sha1Hash, size);
final HttpGet request = new HttpGet(url);
request.addHeader(HttpHeaders.AUTHORIZATION, "TargetToken " + targetToken);
final String sha1HashResult;
try (final CloseableHttpResponse response = httpclient.execute(request)) {
if (response.getStatusLine().getStatusCode() != HttpStatus.OK.value()) {
final String message = wrongStatusCode(url, response);
return new UpdateStatus(ResponseStatus.ERROR, message);
}
if (response.getEntity().getContentLength() != size) {
final String message = wrongContentLength(url, size, response);
return new UpdateStatus(ResponseStatus.ERROR, message);
}
// Exception squid:S2070 - not used for hashing sensitive
// data
@SuppressWarnings("squid:S2070")
final MessageDigest md = MessageDigest.getInstance("SHA-1");
try (final BufferedOutputStream bdos = new BufferedOutputStream(
new DigestOutputStream(ByteStreams.nullOutputStream(), md))) {
try (BufferedInputStream bis = new BufferedInputStream(response.getEntity().getContent())) {
overallread = ByteStreams.copy(bis, bdos);
}
}
if (overallread != size) {
final String message = incompleteRead(url, size, overallread);
return new UpdateStatus(ResponseStatus.ERROR, message);
}
sha1HashResult = BaseEncoding.base16().lowerCase().encode(md.digest());
}
if (!sha1Hash.equalsIgnoreCase(sha1HashResult)) {
final String message = wrongHash(url, sha1Hash, overallread, sha1HashResult);
return new UpdateStatus(ResponseStatus.ERROR, message);
}
} catch (IOException | KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) { } catch (IOException | KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
LOGGER.error("Failed to download" + url, e); LOGGER.error("Failed to download" + url, e);
return new UpdateStatus(ResponseStatus.ERROR, "Failed to download " + url + ": " + e.getMessage()); return new UpdateStatus(ResponseStatus.ERROR, "Failed to download " + url + ": " + e.getMessage());
} }
}
private static UpdateStatus readAndCheckDownloadUrl(final String url, final String targetToken,
final String sha1Hash, final long size)
throws NoSuchAlgorithmException, KeyStoreException, KeyManagementException, IOException {
long overallread;
final CloseableHttpClient httpclient = createHttpClientThatAcceptsAllServerCerts();
final HttpGet request = new HttpGet(url);
request.addHeader(HttpHeaders.AUTHORIZATION, "TargetToken " + targetToken);
final String sha1HashResult;
try (final CloseableHttpResponse response = httpclient.execute(request)) {
if (response.getStatusLine().getStatusCode() != HttpStatus.OK.value()) {
final String message = wrongStatusCode(url, response);
return new UpdateStatus(ResponseStatus.ERROR, message);
}
if (response.getEntity().getContentLength() != size) {
final String message = wrongContentLength(url, size, response);
return new UpdateStatus(ResponseStatus.ERROR, message);
}
// Exception squid:S2070 - not used for hashing sensitive
// data
@SuppressWarnings("squid:S2070")
final MessageDigest md = MessageDigest.getInstance("SHA-1");
overallread = getOverallRead(response, md);
if (overallread != size) {
final String message = incompleteRead(url, size, overallread);
return new UpdateStatus(ResponseStatus.ERROR, message);
}
sha1HashResult = BaseEncoding.base16().lowerCase().encode(md.digest());
}
if (!sha1Hash.equalsIgnoreCase(sha1HashResult)) {
final String message = wrongHash(url, sha1Hash, overallread, sha1HashResult);
return new UpdateStatus(ResponseStatus.ERROR, message);
}
final String message = "Downloaded " + url + " (" + overallread + " bytes)"; final String message = "Downloaded " + url + " (" + overallread + " bytes)";
LOGGER.debug(message); LOGGER.debug(message);
return new UpdateStatus(ResponseStatus.SUCCESSFUL, message); return new UpdateStatus(ResponseStatus.SUCCESSFUL, message);
} }
private static long getOverallRead(final CloseableHttpResponse response, final MessageDigest md)
throws IOException {
long overallread;
try (final BufferedOutputStream bdos = new BufferedOutputStream(
new DigestOutputStream(ByteStreams.nullOutputStream(), md))) {
try (BufferedInputStream bis = new BufferedInputStream(response.getEntity().getContent())) {
overallread = ByteStreams.copy(bis, bdos);
}
}
return overallread;
}
private static String hideTokenDetails(final String targetToken) { private static String hideTokenDetails(final String targetToken) {
if (targetToken == null) { if (targetToken == null) {
return "<NULL!>"; return "<NULL!>";
@@ -285,29 +308,30 @@ public class DeviceSimulatorUpdater {
private static String wrongHash(final String url, final String sha1Hash, final long overallread, private static String wrongHash(final String url, final String sha1Hash, final long overallread,
final String sha1HashResult) { final String sha1HashResult) {
final String message = "Download " + url + " failed with SHA1 hash missmatch (Expected: " + sha1Hash final String message = DOWNLOAD_LOG_MESSAGE + url + " failed with SHA1 hash missmatch (Expected: "
+ " but got: " + sha1HashResult + ") (" + overallread + " bytes)"; + sha1Hash + BUT_GOT_LOG_MESSAGE + sha1HashResult + ") (" + overallread + " bytes)";
LOGGER.error(message); LOGGER.error(message);
return message; return message;
} }
private static String incompleteRead(final String url, final long size, final long overallread) { private static String incompleteRead(final String url, final long size, final long overallread) {
final String message = "Download " + url + " is incomplete (Expected: " + size + " but got: " + overallread final String message = DOWNLOAD_LOG_MESSAGE + url + " is incomplete (Expected: " + size
+ ")"; + BUT_GOT_LOG_MESSAGE + overallread + ")";
LOGGER.error(message); LOGGER.error(message);
return message; return message;
} }
private static String wrongContentLength(final String url, final long size, private static String wrongContentLength(final String url, final long size,
final CloseableHttpResponse response) { final CloseableHttpResponse response) {
final String message = "Download " + url + " has wrong content length (Expected: " + size + " but got: " final String message = DOWNLOAD_LOG_MESSAGE + url + " has wrong content length (Expected: " + size
+ response.getEntity().getContentLength() + ")"; + BUT_GOT_LOG_MESSAGE + response.getEntity().getContentLength() + ")";
LOGGER.error(message); LOGGER.error(message);
return message; return message;
} }
private static String wrongStatusCode(final String url, final CloseableHttpResponse response) { private static String wrongStatusCode(final String url, final CloseableHttpResponse response) {
final String message = "Download " + url + " failed (" + response.getStatusLine().getStatusCode() + ")"; final String message = DOWNLOAD_LOG_MESSAGE + url + " failed (" + response.getStatusLine().getStatusCode()
+ ")";
LOGGER.error(message); LOGGER.error(message);
return message; return message;
} }
@@ -339,4 +363,5 @@ public class DeviceSimulatorUpdater {
*/ */
void updateFinished(AbstractSimulatedDevice device, final Long actionId); void updateFinished(AbstractSimulatedDevice device, final Long actionId);
} }
} }

View File

@@ -8,6 +8,7 @@
*/ */
package org.eclipse.hawkbit.simulator.amqp; package org.eclipse.hawkbit.simulator.amqp;
import java.nio.charset.StandardCharsets;
import java.util.UUID; import java.util.UUID;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -58,7 +59,7 @@ public abstract class SenderService extends MessageService {
} }
message.getMessageProperties().getHeaders().remove(AbstractJavaTypeMapper.DEFAULT_CLASSID_FIELD_NAME); message.getMessageProperties().getHeaders().remove(AbstractJavaTypeMapper.DEFAULT_CLASSID_FIELD_NAME);
final String correlationId = UUID.randomUUID().toString(); final String correlationId = UUID.randomUUID().toString();
message.getMessageProperties().setCorrelationId(correlationId.getBytes()); message.getMessageProperties().setCorrelationId(correlationId.getBytes(StandardCharsets.UTF_8));
if (LOGGER.isTraceEnabled()) { if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Sending message {} to exchange {} with correlationId {}", message, address, correlationId); LOGGER.trace("Sending message {} to exchange {} with correlationId {}", message, address, correlationId);

View File

@@ -67,8 +67,6 @@ public class SpReceiverService extends ReceiverService {
* the incoming message * the incoming message
* @param type * @param type
* the action type * the action type
* @param contentType
* the content type in message header
* @param thingId * @param thingId
* the thing id in message header * the thing id in message header
*/ */
@@ -82,14 +80,11 @@ public class SpReceiverService extends ReceiverService {
private void delegateMessage(final Message message, final String type, final String thingId) { private void delegateMessage(final Message message, final String type, final String thingId) {
final MessageType messageType = MessageType.valueOf(type); final MessageType messageType = MessageType.valueOf(type);
switch (messageType) { if (MessageType.EVENT.equals(messageType)) {
case EVENT:
handleEventMessage(message, thingId); handleEventMessage(message, thingId);
break; return;
default:
LOGGER.info("No valid message type property.");
break;
} }
LOGGER.info("No valid message type property.");
} }
private void handleEventMessage(final Message message, final String thingId) { private void handleEventMessage(final Message message, final String thingId) {

View File

@@ -33,9 +33,10 @@ import com.vaadin.ui.Window;
* Popup dialog window for setting the values of generating the simulated * Popup dialog window for setting the values of generating the simulated
* devices, e.g. the amount. * devices, e.g. the amount.
* *
* @author Michael Hirsch
* *
*/ */
// Vaadin Inheritance
@SuppressWarnings("squid:MaximumInheritanceDepth")
public class GenerateDialog extends Window { public class GenerateDialog extends Window {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -49,8 +50,8 @@ public class GenerateDialog extends Window {
private final TextField pollDelayTextField; private final TextField pollDelayTextField;
private final TextField pollUrlTextField; private final TextField pollUrlTextField;
private final TextField gatewayTokenTextField; private final TextField gatewayTokenTextField;
private final OptionGroup protocolGroup; private OptionGroup protocolGroup;
private final Button buttonOk; private Button buttonOk;
/** /**
* Creates a new pop window for setting the configuration of simulating * Creates a new pop window for setting the configuration of simulating
@@ -87,8 +88,8 @@ public class GenerateDialog extends Window {
gatewayTokenTextField.setColumns(50); gatewayTokenTextField.setColumns(50);
gatewayTokenTextField.setVisible(false); gatewayTokenTextField.setVisible(false);
protocolGroup = createProtocolGroup(); createProtocolGroup();
buttonOk = createOkButton(callback); createOkButton(callback);
namePrefixTextField.addValueChangeListener(event -> checkValid()); namePrefixTextField.addValueChangeListener(event -> checkValid());
amountTextField.addValueChangeListener(event -> checkValid()); amountTextField.addValueChangeListener(event -> checkValid());
@@ -181,9 +182,9 @@ public class GenerateDialog extends Window {
final URL basePollURL, final String gatewayToken, final Protocol protocol); final URL basePollURL, final String gatewayToken, final Protocol protocol);
} }
private OptionGroup createProtocolGroup() { private void createProtocolGroup() {
final OptionGroup protocolGroup = new OptionGroup("Simulated Device Protocol"); this.protocolGroup = new OptionGroup("Simulated Device Protocol");
protocolGroup.addItem(Protocol.DMF_AMQP); protocolGroup.addItem(Protocol.DMF_AMQP);
protocolGroup.addItem(Protocol.DDI_HTTP); protocolGroup.addItem(Protocol.DDI_HTTP);
protocolGroup.setItemCaption(Protocol.DMF_AMQP, "Device Management Federation API (AMQP push)"); protocolGroup.setItemCaption(Protocol.DMF_AMQP, "Device Management Federation API (AMQP push)");
@@ -195,12 +196,11 @@ public class GenerateDialog extends Window {
pollUrlTextField.setVisible(directDeviceOptionSelected); pollUrlTextField.setVisible(directDeviceOptionSelected);
gatewayTokenTextField.setVisible(directDeviceOptionSelected); gatewayTokenTextField.setVisible(directDeviceOptionSelected);
}); });
return protocolGroup;
} }
private Button createOkButton(final GenerateDialogCallback callback) { private void createOkButton(final GenerateDialogCallback callback) {
final Button buttonOk = new Button("generate"); this.buttonOk = new Button("generate");
buttonOk.setImmediate(true); buttonOk.setImmediate(true);
buttonOk.setIcon(FontAwesome.GEARS); buttonOk.setIcon(FontAwesome.GEARS);
buttonOk.addClickListener(event -> { buttonOk.addClickListener(event -> {
@@ -210,14 +210,11 @@ public class GenerateDialog extends Window {
Integer.valueOf(pollDelayTextField.getValue().replace(".", "")), Integer.valueOf(pollDelayTextField.getValue().replace(".", "")),
new URL(pollUrlTextField.getValue()), gatewayTokenTextField.getValue(), new URL(pollUrlTextField.getValue()), gatewayTokenTextField.getValue(),
(Protocol) protocolGroup.getValue()); (Protocol) protocolGroup.getValue());
} catch (final NumberFormatException e) { } catch (final NumberFormatException | MalformedURLException e) {
LOGGER.info(e.getMessage(), e);
} catch (final MalformedURLException e) {
LOGGER.info(e.getMessage(), e); LOGGER.info(e.getMessage(), e);
} }
GenerateDialog.this.close(); GenerateDialog.this.close();
}); });
return buttonOk;
} }
private TextField createRequiredTextfield(final String caption, final String value, final Resource icon, private TextField createRequiredTextfield(final String caption, final String value, final Resource icon,
@@ -226,7 +223,7 @@ public class GenerateDialog extends Window {
return addTextFieldValues(textField, icon, validator); return addTextFieldValues(textField, icon, validator);
} }
private TextField createRequiredTextfield(final String caption, final Property dataSource, final Resource icon, private TextField createRequiredTextfield(final String caption, final Property<?> dataSource, final Resource icon,
final Validator validator) { final Validator validator) {
final TextField textField = new TextField(caption, dataSource); final TextField textField = new TextField(caption, dataSource);
return addTextFieldValues(textField, icon, validator); return addTextFieldValues(textField, icon, validator);

View File

@@ -57,6 +57,11 @@ import com.vaadin.ui.renderers.ProgressBarRenderer;
@SuppressWarnings("squid:MaximumInheritanceDepth") @SuppressWarnings("squid:MaximumInheritanceDepth")
public class SimulatorView extends VerticalLayout implements View { public class SimulatorView extends VerticalLayout implements View {
/**
*
*/
private static final String HTML_SPAN = ";</span>";
private static final String NEXT_POLL_COUNTER_SEC_COL = "nextPollCounterSec"; private static final String NEXT_POLL_COUNTER_SEC_COL = "nextPollCounterSec";
private static final String RESPONSE_STATUS_COL = "updateStatus"; private static final String RESPONSE_STATUS_COL = "updateStatus";
@@ -266,89 +271,90 @@ public class SimulatorView extends VerticalLayout implements View {
})); }));
} }
private Converter<String, Protocol> createProtocolConverter() { private ProtocolConverter createProtocolConverter() {
return new ProtocolConverter();
return new Converter<String, Protocol>() {
private static final long serialVersionUID = 1L;
@Override
public Protocol convertToModel(final String value, final Class<? extends Protocol> targetType,
final Locale locale) {
return null;
}
@Override
public String convertToPresentation(final Protocol value, final Class<? extends String> targetType,
final Locale locale) {
switch (value) {
case DDI_HTTP:
return "DDI API (http)";
case DMF_AMQP:
return "DMF API (amqp)";
default:
return "unknown";
}
}
@Override
public Class<Protocol> getModelType() {
return Protocol.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
};
} }
private Converter<String, Status> createStatusConverter() { private StatusConverter createStatusConverter() {
return new Converter<String, Status>() { return new StatusConverter();
private static final long serialVersionUID = 1L; }
@Override public static final class ProtocolConverter implements Converter<String, Protocol> {
public Status convertToModel(final String value, final Class<? extends Status> targetType, private static final long serialVersionUID = 1L;
final Locale locale) {
return null;
}
@Override @Override
public String convertToPresentation(final Status value, final Class<? extends String> targetType, public Protocol convertToModel(final String value, final Class<? extends Protocol> targetType,
final Locale locale) { final Locale locale) {
switch (value) { return null;
case UNKNWON: }
return "<span class=\"v-icon grayicon\" style=\"font-family: " + FontAwesome.FONT_FAMILY
+ ";\"color\":\"gray\";\">&#x"
+ Integer.toHexString(FontAwesome.QUESTION_CIRCLE.getCodepoint()) + ";</span>";
case PEDNING:
return "<span class=\"v-icon yellowicon\" style=\"font-family: " + FontAwesome.FONT_FAMILY
+ ";\"color\":\"yellow\";\">&#x" + Integer.toHexString(FontAwesome.REFRESH.getCodepoint())
+ ";</span>";
case FINISH:
return "<span class=\"v-icon greenicon\" style=\"font-family: " + FontAwesome.FONT_FAMILY
+ ";\"color\":\"green\";\">&#x"
+ Integer.toHexString(FontAwesome.CHECK_CIRCLE.getCodepoint()) + ";</span>";
case ERROR:
return "<span class=\"v-icon redicon\" style=\"font-family: " + FontAwesome.FONT_FAMILY
+ ";\"color\":\"red\";\">&#x"
+ Integer.toHexString(FontAwesome.EXCLAMATION_CIRCLE.getCodepoint()) + ";</span>";
default:
throw new IllegalStateException("unknown value");
}
}
@Override @Override
public Class<Status> getModelType() { public String convertToPresentation(final Protocol value, final Class<? extends String> targetType,
return Status.class; final Locale locale) {
switch (value) {
case DDI_HTTP:
return "DDI API (http)";
case DMF_AMQP:
return "DMF API (amqp)";
default:
return "unknown";
} }
}
@Override @Override
public Class<String> getPresentationType() { public Class<Protocol> getModelType() {
return String.class; return Protocol.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
}
private static final class StatusConverter implements Converter<String, Status> {
private static final long serialVersionUID = 1L;
@Override
public Status convertToModel(final String value, final Class<? extends Status> targetType,
final Locale locale) {
return null;
}
@Override
public String convertToPresentation(final Status value, final Class<? extends String> targetType,
final Locale locale) {
switch (value) {
case UNKNWON:
return "<span class=\"v-icon grayicon\" style=\"font-family: " + FontAwesome.FONT_FAMILY
+ ";\"color\":\"gray\";\">&#x" + Integer.toHexString(FontAwesome.QUESTION_CIRCLE.getCodepoint())
+ HTML_SPAN;
case PEDNING:
return "<span class=\"v-icon yellowicon\" style=\"font-family: " + FontAwesome.FONT_FAMILY
+ ";\"color\":\"yellow\";\">&#x" + Integer.toHexString(FontAwesome.REFRESH.getCodepoint())
+ HTML_SPAN;
case FINISH:
return "<span class=\"v-icon greenicon\" style=\"font-family: " + FontAwesome.FONT_FAMILY
+ ";\"color\":\"green\";\">&#x" + Integer.toHexString(FontAwesome.CHECK_CIRCLE.getCodepoint())
+ HTML_SPAN;
case ERROR:
return "<span class=\"v-icon redicon\" style=\"font-family: " + FontAwesome.FONT_FAMILY
+ ";\"color\":\"red\";\">&#x"
+ Integer.toHexString(FontAwesome.EXCLAMATION_CIRCLE.getCodepoint()) + HTML_SPAN;
default:
throw new IllegalStateException("unknown value");
} }
}; }
@Override
public Class<Status> getModelType() {
return Status.class;
}
@Override
public Class<String> getPresentationType() {
return String.class;
}
} }
} }

View File

@@ -12,9 +12,11 @@ import java.io.File;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.net.ServerSocket; import java.net.ServerSocket;
import org.apache.commons.io.IOUtils;
/** /**
* *
* * Look for a free port.
*/ */
public class FreePortFileWriter { public class FreePortFileWriter {
@@ -24,7 +26,9 @@ public class FreePortFileWriter {
/** /**
* @param from * @param from
* port range from (start point)
* @param to * @param to
* port range to (end point)
*/ */
public FreePortFileWriter(final int from, final int to, final String filePortPath) { public FreePortFileWriter(final int from, final int to, final String filePortPath) {
this.from = from; this.from = from;
@@ -46,29 +50,28 @@ public class FreePortFileWriter {
} }
boolean isFree(final int port) { boolean isFree(final int port) {
ServerSocket sock = null;
try { try {
final File portFile = new File(filePortPath + File.separator + port + ".port"); final File portFile = new File(filePortPath + File.separator + port + ".port");
portFile.getParentFile().mkdirs(); portFile.getParentFile().mkdirs();
if (portFile.exists()) { if (portFile.exists()) {
return false; return false;
} else {
boolean isFree = false;
final ServerSocket sock = new ServerSocket();
sock.setReuseAddress(true);
sock.bind(new InetSocketAddress(port));
if (portFile.createNewFile()) {
portFile.deleteOnExit();
isFree = true;
}
sock.close();
// is free:
return isFree;
// We rely on an exception thrown to determine availability or
// not availability.
} }
} catch (final Exception e) { boolean isFree = false;
// not free. sock = new ServerSocket();
sock.setReuseAddress(true);
sock.bind(new InetSocketAddress(port));
if (portFile.createNewFile()) {
portFile.deleteOnExit();
isFree = true;
}
return isFree;
// We rely on an exception thrown to determine availability or
// not availability and don't want to log the exception.
} catch (@SuppressWarnings({ "squid:S2221", "squid:S1166" }) final Exception e) {
return false; return false;
} finally {
IOUtils.closeQuietly(sock);
} }
} }

View File

@@ -23,7 +23,7 @@ import com.google.common.eventbus.AsyncEventBus;
import com.google.common.eventbus.EventBus; import com.google.common.eventbus.EventBus;
/** /**
* * Auto configuration for the event bus.
* *
*/ */
@Configuration @Configuration

View File

@@ -21,7 +21,7 @@ import org.springframework.scheduling.annotation.EnableAsync;
/** /**
* *
* * Auto config fot the exception handler.
*/ */
@Configuration @Configuration
@EnableAsync @EnableAsync

View File

@@ -120,6 +120,8 @@ public class SecurityManagedConfiguration {
*/ */
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
// Exception squid:S00112 - Is aspectJ proxy
@SuppressWarnings({ "squid:S00112" })
public UserAuthenticationFilter userAuthenticationFilter() throws Exception { public UserAuthenticationFilter userAuthenticationFilter() throws Exception {
return new UserAuthenticationFilterBasicAuth(configuration.getAuthenticationManager()); return new UserAuthenticationFilterBasicAuth(configuration.getAuthenticationManager());
} }

View File

@@ -56,6 +56,10 @@ public class RedisConfiguration {
return new TenantAwareCacheManager(directCacheManager(), tenantAware); return new TenantAwareCacheManager(directCacheManager(), tenantAware);
} }
/**
*
* @return bean for the direct cache manager.
*/
@Bean(name = "directCacheManager") @Bean(name = "directCacheManager")
public CacheManager directCacheManager() { public CacheManager directCacheManager() {
return new RedisCacheManager(redisTemplate()); return new RedisCacheManager(redisTemplate());

View File

@@ -28,7 +28,7 @@ import com.google.common.eventbus.EventBus;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
/** /**
* * The distributor for events.
* *
*/ */
@EventSubscriber @EventSubscriber
@@ -100,11 +100,11 @@ public class EventDistributor {
return topics; return topics;
} }
private void logDistributingEvent(final Event event, final String channel) { private static void logDistributingEvent(final Event event, final String channel) {
LOGGER.trace("distributing event {} from node {} to topic {}", event, NODE_ID, channel); LOGGER.trace("distributing event {} from node {} to topic {}", event, NODE_ID, channel);
} }
private void logNotDistributingEvent(final Event event, final String channel) { private static void logNotDistributingEvent(final Event event, final String channel) {
LOGGER.debug("no redis template configured, event {} will not be distributed to channel {} from node {}", event, LOGGER.debug("no redis template configured, event {} will not be distributed to channel {} from node {}", event,
channel, NODE_ID); channel, NODE_ID);
} }

View File

@@ -16,9 +16,6 @@ import org.springframework.boot.context.properties.ConfigurationProperties;
*/ */
@ConfigurationProperties("hawkbit.artifact.url") @ConfigurationProperties("hawkbit.artifact.url")
public class ArtifactUrlHandlerProperties { public class ArtifactUrlHandlerProperties {
private static final String DEFAULT_IP_LOCALHOST = "127.0.0.1";
private static final String DEFAULT_PORT = "8080";
private static final String LOCALHOST = "localhost";
private final Http http = new Http(); private final Http http = new Http();
private final Https https = new Https(); private final Https https = new Https();
@@ -55,227 +52,45 @@ public class ArtifactUrlHandlerProperties {
} }
} }
/**
* Interface for declaring common properties through all supported protocols
* pattern.
*/
public interface ProtocolProperties {
/**
* @return the hostname value to resolve in the pattern.
*/
String getHostname();
/**
* @return the IP address value to resolve in the pattern.
*/
String getIp();
/**
* @return the port value to resolve in the pattern.
*/
String getPort();
/**
* @return the pattern to build the URL.
*/
String getPattern();
/**
* @return <code>true</code> if the {@link ProtocolProperties} is
* enabled.
*/
boolean isEnabled();
}
/** /**
* Object to hold the properties for the HTTP protocol. * Object to hold the properties for the HTTP protocol.
*/ */
public static class Http implements ProtocolProperties { public static class Http extends DefaultProtocolProperties {
private String hostname = LOCALHOST;
private String ip = DEFAULT_IP_LOCALHOST;
private String port = DEFAULT_PORT;
/**
* An ant-URL pattern with placeholder to build the URL on. The URL can
* have specific artifact placeholder.
*/
private String pattern = "{protocol}://{hostname}:{port}/{tenant}/controller/v1/{targetId}/softwaremodules/{softwareModuleId}/artifacts/{artifactFileName}";
/** /**
* Enables HTTP URI generation in DDI and DMF. * Constructor.
*/ */
private boolean enabled = true; public Http() {
setPattern(
@Override "{protocol}://{hostname}:{port}/{tenant}/controller/v1/{targetId}/softwaremodules/{softwareModuleId}/artifacts/{artifactFileName}");
public boolean isEnabled() {
return enabled;
}
public void setEnabled(final boolean enabled) {
this.enabled = enabled;
}
@Override
public String getHostname() {
return hostname;
}
public void setHostname(final String hostname) {
this.hostname = hostname;
}
@Override
public String getIp() {
return ip;
}
public void setIp(final String ip) {
this.ip = ip;
}
@Override
public String getPattern() {
return pattern;
}
public void setPattern(final String urlPattern) {
this.pattern = urlPattern;
}
@Override
public String getPort() {
return port;
}
public void setPort(final String port) {
this.port = port;
} }
} }
/** /**
* Object to hold the properties for the HTTP protocol. * Object to hold the properties for the HTTP protocol.
*/ */
public static class Https implements ProtocolProperties { public static class Https extends DefaultProtocolProperties {
private String hostname = LOCALHOST;
private String ip = DEFAULT_IP_LOCALHOST;
private String port = DEFAULT_PORT;
/**
* An ant-URL pattern with placeholder to build the URL on. The URL can
* have specific artifact placeholder.
*/
private String pattern = "{protocol}://{hostname}:{port}/{tenant}/controller/v1/{targetId}/softwaremodules/{softwareModuleId}/artifacts/{artifactFileName}";
/** /**
* Enables HTTPS URI generation in DDI and DMF. * Constructor.
*/ */
private boolean enabled = true; public Https() {
setPattern(
@Override "{protocol}://{hostname}:{port}/{tenant}/controller/v1/{targetId}/softwaremodules/{softwareModuleId}/artifacts/{artifactFileName}");
public boolean isEnabled() {
return enabled;
}
public void setEnabled(final boolean enabled) {
this.enabled = enabled;
}
@Override
public String getHostname() {
return hostname;
}
public void setHostname(final String hostname) {
this.hostname = hostname;
}
@Override
public String getIp() {
return ip;
}
public void setIp(final String ip) {
this.ip = ip;
}
@Override
public String getPattern() {
return pattern;
}
public void setPattern(final String urlPattern) {
this.pattern = urlPattern;
}
@Override
public String getPort() {
return port;
}
public void setPort(final String port) {
this.port = port;
} }
} }
/** /**
* Object to hold the properties for the HTTP protocol. * Object to hold the properties for the HTTP protocol.
*/ */
public static class Coap implements ProtocolProperties { public static class Coap extends DefaultProtocolProperties {
private String hostname = LOCALHOST;
private String ip = DEFAULT_IP_LOCALHOST;
private String port = "5683";
/**
* An ant-URL pattern with placeholder to build the URL on. The URL can
* have specific artifact placeholder.
*/
private String pattern = "{protocol}://{ip}:{port}/fw/{tenant}/{targetId}/sha1/{artifactSHA1}";
/** /**
* Enables CoAP URI generation in DMF. * Constructor.
*/ */
private boolean enabled = true; public Coap() {
setPattern("{protocol}://{ip}:{port}/fw/{tenant}/{targetId}/sha1/{artifactSHA1}");
@Override setPort("5683");
public boolean isEnabled() {
return enabled;
}
public void setEnabled(final boolean enabled) {
this.enabled = enabled;
}
@Override
public String getHostname() {
return hostname;
}
public void setHostname(final String hostname) {
this.hostname = hostname;
}
@Override
public String getIp() {
return ip;
}
public void setIp(final String ip) {
this.ip = ip;
}
@Override
public String getPattern() {
return pattern;
}
public void setPattern(final String urlPattern) {
this.pattern = urlPattern;
}
@Override
public String getPort() {
return port;
}
public void setPort(final String port) {
this.port = port;
} }
} }

View File

@@ -0,0 +1,79 @@
/**
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.api;
/**
* Object to hold the properties for the base protocols.
*/
public class DefaultProtocolProperties implements ProtocolProperties {
// The IP address is not hardcoded. It's the default value, if the IP
// address is not configured.
@SuppressWarnings("squid:S1313")
private static final String DEFAULT_IP_LOCALHOST = "127.0.0.1";
private static final String LOCALHOST = "localhost";
private String hostname = LOCALHOST;
private String ip = DEFAULT_IP_LOCALHOST;
private String port = "";
/**
* An ant-URL pattern with placeholder to build the URL on. The URL can have
* specific artifact placeholder.
*/
private String pattern;
/**
* Enables protocol.
*/
private boolean enabled = true;
@Override
public boolean isEnabled() {
return enabled;
}
public void setEnabled(final boolean enabled) {
this.enabled = enabled;
}
@Override
public String getHostname() {
return hostname;
}
public void setHostname(final String hostname) {
this.hostname = hostname;
}
@Override
public String getIp() {
return ip;
}
public void setIp(final String ip) {
this.ip = ip;
}
@Override
public String getPattern() {
return pattern;
}
public void setPattern(final String urlPattern) {
this.pattern = urlPattern;
}
@Override
public String getPort() {
return port;
}
public void setPort(final String port) {
this.port = port;
}
}

View File

@@ -13,7 +13,6 @@ import java.util.Map;
import java.util.Map.Entry; import java.util.Map.Entry;
import java.util.Set; import java.util.Set;
import org.eclipse.hawkbit.api.ArtifactUrlHandlerProperties.ProtocolProperties;
import org.eclipse.hawkbit.tenancy.TenantAware; import org.eclipse.hawkbit.tenancy.TenantAware;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties; import org.springframework.boot.context.properties.EnableConfigurationProperties;

View File

@@ -0,0 +1,40 @@
/**
* Copyright (c) 2015 Bosch Software Innovations GmbH and others.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*/
package org.eclipse.hawkbit.api;
/**
* Interface for declaring common properties through all supported protocols
* pattern.
*/
public interface ProtocolProperties {
/**
* @return the hostname value to resolve in the pattern.
*/
String getHostname();
/**
* @return the IP address value to resolve in the pattern.
*/
String getIp();
/**
* @return the port value to resolve in the pattern.
*/
String getPort();
/**
* @return the pattern to build the URL.
*/
String getPattern();
/**
* @return <code>true</code> if the {@link ProtocolProperties} is enabled.
*/
boolean isEnabled();
}

View File

@@ -13,7 +13,7 @@ import org.springframework.cache.CacheManager;
/** /**
* *
* * A cache interface which handles multi tenancy.
*/ */
public interface TenancyCacheManager extends CacheManager { public interface TenancyCacheManager extends CacheManager {

View File

@@ -67,7 +67,7 @@ public class TenantAwareCacheManager implements TenancyCacheManager {
public Collection<String> getCacheNames() { public Collection<String> getCacheNames() {
String currentTenant = tenantAware.getCurrentTenant(); String currentTenant = tenantAware.getCurrentTenant();
if (currentTenant == null) { if (currentTenant == null) {
return null; return Collections.emptyList();
} }
currentTenant = currentTenant.toUpperCase(); currentTenant = currentTenant.toUpperCase();

View File

@@ -17,7 +17,7 @@ import java.net.URI;
* *
* *
*/ */
public class CancelTargetAssignmentEvent extends AbstractEvent { public class CancelTargetAssignmentEvent extends DefaultEvent {
private final String controllerId; private final String controllerId;
private final Long actionId; private final Long actionId;

View File

@@ -12,11 +12,10 @@ package org.eclipse.hawkbit.eventbus.event;
* Abstract event definition class which holds the necessary revsion and tenant * Abstract event definition class which holds the necessary revsion and tenant
* information which every event needs. * information which every event needs.
* *
* @author Michael Hirsch
* @see AbstractDistributedEvent for events which should be distributed to other * @see AbstractDistributedEvent for events which should be distributed to other
* cluster nodes * cluster nodes
*/ */
public class AbstractEvent implements Event { public class DefaultEvent implements Event {
private final long revision; private final long revision;
private final String tenant; private final String tenant;
@@ -27,7 +26,7 @@ public class AbstractEvent implements Event {
* @param tenant * @param tenant
* the tenant of the event * the tenant of the event
*/ */
protected AbstractEvent(final long revision, final String tenant) { protected DefaultEvent(final long revision, final String tenant) {
this.revision = revision; this.revision = revision;
this.tenant = tenant; this.tenant = tenant;
} }

View File

@@ -9,9 +9,7 @@
package org.eclipse.hawkbit.eventbus.event; package org.eclipse.hawkbit.eventbus.event;
/** /**
* * The event when a target is deleted.
*
*
*/ */
public class TargetDeletedEvent extends AbstractDistributedEvent { public class TargetDeletedEvent extends AbstractDistributedEvent {

View File

@@ -15,8 +15,7 @@ package org.eclipse.hawkbit.exception;
* Generic Custom Exception to wrap the Runtime and checked exception * Generic Custom Exception to wrap the Runtime and checked exception
* *
*/ */
public abstract class AbstractServerRtException extends RuntimeException {
public abstract class SpServerRtException extends RuntimeException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@@ -28,7 +27,7 @@ public abstract class SpServerRtException extends RuntimeException {
* @param error * @param error
* detail * detail
*/ */
public SpServerRtException(final SpServerError error) { public AbstractServerRtException(final SpServerError error) {
super(error.getMessage()); super(error.getMessage());
this.error = error; this.error = error;
} }
@@ -41,7 +40,7 @@ public abstract class SpServerRtException extends RuntimeException {
* @param error * @param error
* detail * detail
*/ */
public SpServerRtException(final String message, final SpServerError error) { public AbstractServerRtException(final String message, final SpServerError error) {
super(message); super(message);
this.error = error; this.error = error;
} }
@@ -56,7 +55,7 @@ public abstract class SpServerRtException extends RuntimeException {
* @param cause * @param cause
* of the exception * of the exception
*/ */
public SpServerRtException(final String message, final SpServerError error, final Throwable cause) { public AbstractServerRtException(final String message, final SpServerError error, final Throwable cause) {
super(message, cause); super(message, cause);
this.error = error; this.error = error;
} }
@@ -69,7 +68,7 @@ public abstract class SpServerRtException extends RuntimeException {
* @param cause * @param cause
* of the exception * of the exception
*/ */
public SpServerRtException(final SpServerError error, final Throwable cause) { public AbstractServerRtException(final SpServerError error, final Throwable cause) {
super(error.getMessage(), cause); super(error.getMessage(), cause);
this.error = error; this.error = error;
} }

View File

@@ -16,7 +16,7 @@ package org.eclipse.hawkbit.exception;
* *
* *
*/ */
public class GenericSpServerException extends SpServerRtException { public class GenericSpServerException extends AbstractServerRtException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final SpServerError THIS_ERROR = SpServerError.SP_REPO_GENERIC_ERROR; private static final SpServerError THIS_ERROR = SpServerError.SP_REPO_GENERIC_ERROR;

View File

@@ -11,11 +11,8 @@ package org.eclipse.hawkbit.repository;
/** /**
* Sort fields for {@link ActionRest}. * Sort fields for {@link ActionRest}.
* *
*
*
*
*/ */
public enum ActionFields implements FieldNameProvider,FieldValueConverter<ActionFields> { public enum ActionFields implements FieldNameProvider, FieldValueConverter<ActionFields> {
/** /**
* The status field. * The status field.
@@ -42,13 +39,10 @@ public enum ActionFields implements FieldNameProvider,FieldValueConverter<Action
@Override @Override
public Object convertValue(final ActionFields e, final String value) { public Object convertValue(final ActionFields e, final String value) {
switch (e) { if (STATUS.equals(e)) {
case STATUS:
return convertStatusValue(value); return convertStatusValue(value);
default:
return value;
} }
return value;
} }
private static Object convertStatusValue(final String value) { private static Object convertStatusValue(final String value) {
@@ -64,11 +58,9 @@ public enum ActionFields implements FieldNameProvider,FieldValueConverter<Action
@Override @Override
public String[] possibleValues(final ActionFields e) { public String[] possibleValues(final ActionFields e) {
switch (e) { if (STATUS.equals(e)) {
case STATUS:
return new String[] { ACTIVE, INACTIVE }; return new String[] { ACTIVE, INACTIVE };
default:
return new String[0];
} }
return new String[0];
} }
} }

View File

@@ -22,7 +22,7 @@ public interface FieldNameProvider {
/** /**
* Separator for the sub attributes * Separator for the sub attributes
*/ */
public static final String SUB_ATTRIBUTE_SEPERATOR = "."; String SUB_ATTRIBUTE_SEPERATOR = ".";
/** /**
* @return the string representation of the underlying persistence field * @return the string representation of the underlying persistence field
@@ -30,13 +30,24 @@ public interface FieldNameProvider {
*/ */
String getFieldName(); String getFieldName();
/**
* Contains the sub entity the given field.
*
* @param propertyField
* the given field
* @return <true> contains <false> contains not
*/
default boolean containsSubEntityAttribute(final String propertyField) { default boolean containsSubEntityAttribute(final String propertyField) {
return FieldNameProvider.containsSubEntityAttribute(propertyField, getSubEntityAttributes()); return FieldNameProvider.containsSubEntityAttribute(propertyField, getSubEntityAttributes());
}; }
/**
*
* @return all sub entities attributes.
*/
default List<String> getSubEntityAttributes() { default List<String> getSubEntityAttributes() {
return Collections.emptyList(); return Collections.emptyList();
}; }
/** /**
* the database column for the key * the database column for the key
@@ -59,11 +70,11 @@ public interface FieldNameProvider {
/** /**
* Is the entity field a {@link Map}. * Is the entity field a {@link Map}.
* *
* @return * @return <true> is a map <false> is not a map
*/ */
default boolean isMap() { default boolean isMap() {
return getKeyFieldName() != null; return getKeyFieldName() != null;
}; }
/** /**
* Check if a sub attribute exists. * Check if a sub attribute exists.

View File

@@ -27,7 +27,7 @@ public final class DurationHelper {
* the defined min/max range. * the defined min/max range.
* *
*/ */
public static class DurationRangeValidator { public static final class DurationRangeValidator {
final Duration min; final Duration min;
final Duration max; final Duration max;

View File

@@ -9,14 +9,14 @@
package org.eclipse.hawkbit.tenancy.configuration; package org.eclipse.hawkbit.tenancy.configuration;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* The {@link #InvalidTenantConfigurationKeyException} is thrown when an invalid * The {@link #InvalidTenantConfigurationKeyException} is thrown when an invalid
* configuration key is used. * configuration key is used.
* *
*/ */
public class InvalidTenantConfigurationKeyException extends SpServerRtException { public class InvalidTenantConfigurationKeyException extends AbstractServerRtException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final SpServerError THIS_ERROR = SpServerError.SP_CONFIGURATION_KEY_INVALID; private static final SpServerError THIS_ERROR = SpServerError.SP_CONFIGURATION_KEY_INVALID;

View File

@@ -22,7 +22,7 @@ public interface TenantConfigurationValidator {
* @throws TenantConfigurationValidatorException * @throws TenantConfigurationValidatorException
* is thrown, when parameter is invalid. * is thrown, when parameter is invalid.
*/ */
default void validate(final Object tenantConfigurationValue) throws TenantConfigurationValidatorException { default void validate(final Object tenantConfigurationValue) {
if (tenantConfigurationValue != null if (tenantConfigurationValue != null
&& validateToClass().isAssignableFrom(tenantConfigurationValue.getClass())) { && validateToClass().isAssignableFrom(tenantConfigurationValue.getClass())) {
return; return;

View File

@@ -9,14 +9,14 @@
package org.eclipse.hawkbit.tenancy.configuration.validator; package org.eclipse.hawkbit.tenancy.configuration.validator;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Exception which is thrown, when the validation of the configuration value has * Exception which is thrown, when the validation of the configuration value has
* not been successful. * not been successful.
* *
*/ */
public class TenantConfigurationValidatorException extends SpServerRtException { public class TenantConfigurationValidatorException extends AbstractServerRtException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final SpServerError THIS_ERROR = SpServerError.SP_CONFIGURATION_VALUE_INVALID; private static final SpServerError THIS_ERROR = SpServerError.SP_CONFIGURATION_VALUE_INVALID;

View File

@@ -27,6 +27,7 @@ public class DdiArtifactHash {
* Default constructor. * Default constructor.
*/ */
public DdiArtifactHash() { public DdiArtifactHash() {
// needed for json create
} }
/** /**

View File

@@ -29,7 +29,7 @@ public class DdiChunk {
private List<DdiArtifact> artifacts; private List<DdiArtifact> artifacts;
public DdiChunk() { public DdiChunk() {
// needed for json create
} }
/** /**

View File

@@ -34,8 +34,11 @@ public class DdiConfig {
this.polling = polling; this.polling = polling;
} }
/**
* Constructor.
*/
public DdiConfig() { public DdiConfig() {
// needed for json create.
} }
public DdiPolling getPolling() { public DdiPolling getPolling() {

View File

@@ -37,7 +37,7 @@ public class DdiControllerBase extends ResourceSupport {
} }
public DdiControllerBase() { public DdiControllerBase() {
// needed for json create
} }
public DdiConfig getConfig() { public DdiConfig getConfig() {

View File

@@ -23,8 +23,11 @@ public class DdiDeployment {
private List<DdiChunk> chunks; private List<DdiChunk> chunks;
/**
* Constructor.
*/
public DdiDeployment() { public DdiDeployment() {
// needed for json create.
} }
/** /**

View File

@@ -21,10 +21,10 @@ public class DdiDeploymentBase extends ResourceSupport {
@JsonProperty("id") @JsonProperty("id")
@NotNull @NotNull
private String deplyomentId; private final String deplyomentId;
@NotNull @NotNull
private DdiDeployment deployment; private final DdiDeployment deployment;
/** /**
* Constructor. * Constructor.
@@ -35,14 +35,10 @@ public class DdiDeploymentBase extends ResourceSupport {
* details. * details.
*/ */
public DdiDeploymentBase(final String id, final DdiDeployment deployment) { public DdiDeploymentBase(final String id, final DdiDeployment deployment) {
deplyomentId = id; this.deplyomentId = id;
this.deployment = deployment; this.deployment = deployment;
} }
public DdiDeploymentBase() {
}
public DdiDeployment getDeployment() { public DdiDeployment getDeployment() {
return deployment; return deployment;
} }

View File

@@ -30,11 +30,15 @@ public class DdiPolling {
* between polls * between polls
*/ */
public DdiPolling(final String sleep) { public DdiPolling(final String sleep) {
super();
this.sleep = sleep; this.sleep = sleep;
} }
/**
* Constructor.
*
*/
public DdiPolling() { public DdiPolling() {
// needed for json create
} }
public String getSleep() { public String getSleep() {

View File

@@ -60,8 +60,8 @@ import ru.yandex.qatools.allure.annotations.Stories;
@Stories("Deployment Action Resource") @Stories("Deployment Action Resource")
public class DdiDeploymentBaseTest extends AbstractRestIntegrationTestWithMongoDB { public class DdiDeploymentBaseTest extends AbstractRestIntegrationTestWithMongoDB {
private static final String HTTP_LOCALHOST = "http://localhost:8080/"; private static final String HTTP_LOCALHOST = "http://localhost/";
private static final String HTTPS_LOCALHOST = "https://localhost:8080/"; private static final String HTTPS_LOCALHOST = "https://localhost/";
@Test() @Test()
@Description("Ensures that artifacts are not found, when softare module does not exists.") @Description("Ensures that artifacts are not found, when softare module does not exists.")

View File

@@ -36,7 +36,7 @@ import org.springframework.stereotype.Component;
/** /**
* *
* * A controller which handles the amqp authentfication.
*/ */
@Component @Component
public class AmqpControllerAuthentfication { public class AmqpControllerAuthentfication {

View File

@@ -10,6 +10,7 @@ package org.eclipse.hawkbit.amqp;
import java.net.URI; import java.net.URI;
import java.net.URISyntaxException; import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.util.Collections; import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.UUID; import java.util.UUID;
@@ -137,6 +138,13 @@ public class AmqpMessageHandlerService extends BaseAmqpService {
return onMessage(message, type, tenant, getRabbitTemplate().getConnectionFactory().getVirtualHost()); return onMessage(message, type, tenant, getRabbitTemplate().getConnectionFactory().getVirtualHost());
} }
/**
* Executed on a authentication request.
*
* @param message
* the amqp message
* @return the rpc message back to supplier.
*/
@RabbitListener(queues = "${hawkbit.dmf.rabbitmq.authenticationReceiverQueue}", containerFactory = "listenerContainerFactory") @RabbitListener(queues = "${hawkbit.dmf.rabbitmq.authenticationReceiverQueue}", containerFactory = "listenerContainerFactory")
public Message onAuthenticationRequest(final Message message) { public Message onAuthenticationRequest(final Message message) {
checkContentTypeJson(message); checkContentTypeJson(message);
@@ -152,6 +160,19 @@ public class AmqpMessageHandlerService extends BaseAmqpService {
} }
} }
/**
* * Executed if a amqp message arrives.
*
* @param message
* the message
* @param type
* the type
* @param tenant
* the tenant
* @param virtualHost
* the virtual host
* @return the rpc message back to supplier.
*/
public Message onMessage(final Message message, final String type, final String tenant, final String virtualHost) { public Message onMessage(final Message message, final String type, final String tenant, final String virtualHost) {
checkContentTypeJson(message); checkContentTypeJson(message);
final SecurityContext oldContext = SecurityContextHolder.getContext(); final SecurityContext oldContext = SecurityContextHolder.getContext();
@@ -417,7 +438,7 @@ public class AmqpMessageHandlerService extends BaseAmqpService {
} }
private static String convertCorrelationId(final Message message) { private static String convertCorrelationId(final Message message) {
return new String(message.getMessageProperties().getCorrelationId()); return new String(message.getMessageProperties().getCorrelationId(), StandardCharsets.UTF_8);
} }
private Action getUpdateActionStatus(final ActionStatus actionStatus) { private Action getUpdateActionStatus(final ActionStatus actionStatus) {

View File

@@ -39,16 +39,6 @@ public class BaseAmqpService {
this.rabbitTemplate = rabbitTemplate; this.rabbitTemplate = rabbitTemplate;
} }
/**
* Clean message properties before sending a message.
*
* @param message
* the message to cleaned up
*/
protected void cleanMessageHeaderProperties(final Message message) {
message.getMessageProperties().getHeaders().remove(AbstractJavaTypeMapper.DEFAULT_CLASSID_FIELD_NAME);
}
/** /**
* Is needed to convert a incoming message to is originally object type. * Is needed to convert a incoming message to is originally object type.
* *
@@ -68,7 +58,7 @@ public class BaseAmqpService {
return (T) rabbitTemplate.getMessageConverter().fromMessage(message); return (T) rabbitTemplate.getMessageConverter().fromMessage(message);
} }
private boolean isMessageBodyEmpty(final Message message) { private static boolean isMessageBodyEmpty(final Message message) {
return message == null || message.getBody() == null || message.getBody().length == 0; return message == null || message.getBody() == null || message.getBody().length == 0;
} }
@@ -98,8 +88,7 @@ public class BaseAmqpService {
return rabbitTemplate.getMessageConverter(); return rabbitTemplate.getMessageConverter();
} }
protected final String getStringHeaderKey(final Message message, final String key, protected String getStringHeaderKey(final Message message, final String key, final String errorMessageIfNull) {
final String errorMessageIfNull) {
final Map<String, Object> header = message.getMessageProperties().getHeaders(); final Map<String, Object> header = message.getMessageProperties().getHeaders();
final Object value = header.get(key); final Object value = header.get(key);
if (value == null) { if (value == null) {
@@ -117,4 +106,15 @@ public class BaseAmqpService {
protected RabbitTemplate getRabbitTemplate() { protected RabbitTemplate getRabbitTemplate() {
return rabbitTemplate; return rabbitTemplate;
} }
/**
* Clean message properties before sending a message.
*
* @param message
* the message to cleaned up
*/
protected void cleanMessageHeaderProperties(final Message message) {
message.getMessageProperties().getHeaders().remove(AbstractJavaTypeMapper.DEFAULT_CLASSID_FIELD_NAME);
}
} }

View File

@@ -9,6 +9,7 @@
package org.eclipse.hawkbit.amqp; package org.eclipse.hawkbit.amqp;
import java.net.URI; import java.net.URI;
import java.nio.charset.StandardCharsets;
import java.util.UUID; import java.util.UUID;
import org.eclipse.hawkbit.util.IpUtil; import org.eclipse.hawkbit.util.IpUtil;
@@ -46,7 +47,7 @@ public class DefaultAmqpSenderService implements AmqpSenderService {
final String correlationId = UUID.randomUUID().toString(); final String correlationId = UUID.randomUUID().toString();
final String exchange = extractExchange(replyTo); final String exchange = extractExchange(replyTo);
message.getMessageProperties().setCorrelationId(correlationId.getBytes()); message.getMessageProperties().setCorrelationId(correlationId.getBytes(StandardCharsets.UTF_8));
if (LOGGER.isTraceEnabled()) { if (LOGGER.isTraceEnabled()) {
LOGGER.trace("Sending message {} to exchange {} with correlationId {}", message, exchange, correlationId); LOGGER.trace("Sending message {} to exchange {} with correlationId {}", message, exchange, correlationId);

View File

@@ -114,7 +114,7 @@ public class AmqpControllerAuthenticationTest {
@Description("Tests authentication manager without principal") @Description("Tests authentication manager without principal")
public void testAuthenticationeBadCredantialsWithoutPricipal() { public void testAuthenticationeBadCredantialsWithoutPricipal() {
final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, CONTROLLLER_ID, final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, CONTROLLLER_ID,
FileResource.sha1("12345")); FileResource.createFileResourceBySha1("12345"));
try { try {
authenticationManager.doAuthenticate(securityToken); authenticationManager.doAuthenticate(securityToken);
fail("BadCredentialsException was excepeted since principal was missing"); fail("BadCredentialsException was excepeted since principal was missing");
@@ -128,7 +128,7 @@ public class AmqpControllerAuthenticationTest {
@Description("Tests authentication manager without wrong credential") @Description("Tests authentication manager without wrong credential")
public void testAuthenticationBadCredantialsWithWrongCredential() { public void testAuthenticationBadCredantialsWithWrongCredential() {
final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, CONTROLLLER_ID, final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, CONTROLLLER_ID,
FileResource.sha1("12345")); FileResource.createFileResourceBySha1("12345"));
when(tenantConfigurationManagement.getConfigurationValue( when(tenantConfigurationManagement.getConfigurationValue(
eq(TenantConfigurationKey.AUTHENTICATION_MODE_TARGET_SECURITY_TOKEN_ENABLED), eq(Boolean.class))) eq(TenantConfigurationKey.AUTHENTICATION_MODE_TARGET_SECURITY_TOKEN_ENABLED), eq(Boolean.class)))
.thenReturn(CONFIG_VALUE_TRUE); .thenReturn(CONFIG_VALUE_TRUE);
@@ -146,7 +146,7 @@ public class AmqpControllerAuthenticationTest {
@Description("Tests authentication successfull") @Description("Tests authentication successfull")
public void testSuccessfullAuthentication() { public void testSuccessfullAuthentication() {
final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, CONTROLLLER_ID, final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, CONTROLLLER_ID,
FileResource.sha1("12345")); FileResource.createFileResourceBySha1("12345"));
when(tenantConfigurationManagement.getConfigurationValue( when(tenantConfigurationManagement.getConfigurationValue(
eq(TenantConfigurationKey.AUTHENTICATION_MODE_TARGET_SECURITY_TOKEN_ENABLED), eq(Boolean.class))) eq(TenantConfigurationKey.AUTHENTICATION_MODE_TARGET_SECURITY_TOKEN_ENABLED), eq(Boolean.class)))
.thenReturn(CONFIG_VALUE_TRUE); .thenReturn(CONFIG_VALUE_TRUE);
@@ -161,7 +161,7 @@ public class AmqpControllerAuthenticationTest {
final MessageProperties messageProperties = createMessageProperties(null); final MessageProperties messageProperties = createMessageProperties(null);
final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, CONTROLLLER_ID, final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, CONTROLLLER_ID,
FileResource.sha1("12345")); FileResource.createFileResourceBySha1("12345"));
final Message message = amqpMessageHandlerService.getMessageConverter().toMessage(securityToken, final Message message = amqpMessageHandlerService.getMessageConverter().toMessage(securityToken,
messageProperties); messageProperties);
@@ -179,7 +179,7 @@ public class AmqpControllerAuthenticationTest {
public void testAuthenticationMessageBadCredantialsWithWrongCredential() { public void testAuthenticationMessageBadCredantialsWithWrongCredential() {
final MessageProperties messageProperties = createMessageProperties(null); final MessageProperties messageProperties = createMessageProperties(null);
final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, CONTROLLLER_ID, final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, CONTROLLLER_ID,
FileResource.sha1("12345")); FileResource.createFileResourceBySha1("12345"));
when(tenantConfigurationManagement.getConfigurationValue( when(tenantConfigurationManagement.getConfigurationValue(
eq(TenantConfigurationKey.AUTHENTICATION_MODE_TARGET_SECURITY_TOKEN_ENABLED), eq(Boolean.class))) eq(TenantConfigurationKey.AUTHENTICATION_MODE_TARGET_SECURITY_TOKEN_ENABLED), eq(Boolean.class)))
.thenReturn(CONFIG_VALUE_TRUE); .thenReturn(CONFIG_VALUE_TRUE);
@@ -201,7 +201,7 @@ public class AmqpControllerAuthenticationTest {
public void testSuccessfullMessageAuthentication() { public void testSuccessfullMessageAuthentication() {
final MessageProperties messageProperties = createMessageProperties(null); final MessageProperties messageProperties = createMessageProperties(null);
final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, CONTROLLLER_ID, final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, CONTROLLLER_ID,
FileResource.sha1("12345")); FileResource.createFileResourceBySha1("12345"));
when(tenantConfigurationManagement.getConfigurationValue( when(tenantConfigurationManagement.getConfigurationValue(
eq(TenantConfigurationKey.AUTHENTICATION_MODE_TARGET_SECURITY_TOKEN_ENABLED), eq(Boolean.class))) eq(TenantConfigurationKey.AUTHENTICATION_MODE_TARGET_SECURITY_TOKEN_ENABLED), eq(Boolean.class)))
.thenReturn(CONFIG_VALUE_TRUE); .thenReturn(CONFIG_VALUE_TRUE);

View File

@@ -279,7 +279,8 @@ public class AmqpMessageHandlerServiceTest {
@Description("Tests that an download request is denied for an artifact which does not exists") @Description("Tests that an download request is denied for an artifact which does not exists")
public void authenticationRequestDeniedForArtifactWhichDoesNotExists() { public void authenticationRequestDeniedForArtifactWhichDoesNotExists() {
final MessageProperties messageProperties = createMessageProperties(null); final MessageProperties messageProperties = createMessageProperties(null);
final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, "123", FileResource.sha1("12345")); final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, "123",
FileResource.createFileResourceBySha1("12345"));
final Message message = amqpMessageHandlerService.getMessageConverter().toMessage(securityToken, final Message message = amqpMessageHandlerService.getMessageConverter().toMessage(securityToken,
messageProperties); messageProperties);
@@ -297,7 +298,8 @@ public class AmqpMessageHandlerServiceTest {
@Description("Tests that an download request is denied for an artifact which is not assigned to the requested target") @Description("Tests that an download request is denied for an artifact which is not assigned to the requested target")
public void authenticationRequestDeniedForArtifactWhichIsNotAssignedToTarget() { public void authenticationRequestDeniedForArtifactWhichIsNotAssignedToTarget() {
final MessageProperties messageProperties = createMessageProperties(null); final MessageProperties messageProperties = createMessageProperties(null);
final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, "123", FileResource.sha1("12345")); final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, "123",
FileResource.createFileResourceBySha1("12345"));
final Message message = amqpMessageHandlerService.getMessageConverter().toMessage(securityToken, final Message message = amqpMessageHandlerService.getMessageConverter().toMessage(securityToken,
messageProperties); messageProperties);
@@ -320,7 +322,8 @@ public class AmqpMessageHandlerServiceTest {
@Description("Tests that an download request is allowed for an artifact which exists and assigned to the requested target") @Description("Tests that an download request is allowed for an artifact which exists and assigned to the requested target")
public void authenticationRequestAllowedForArtifactWhichExistsAndAssignedToTarget() throws MalformedURLException { public void authenticationRequestAllowedForArtifactWhichExistsAndAssignedToTarget() throws MalformedURLException {
final MessageProperties messageProperties = createMessageProperties(null); final MessageProperties messageProperties = createMessageProperties(null);
final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, "123", FileResource.sha1("12345")); final TenantSecurityToken securityToken = new TenantSecurityToken(TENANT, "123",
FileResource.createFileResourceBySha1("12345"));
final Message message = amqpMessageHandlerService.getMessageConverter().toMessage(securityToken, final Message message = amqpMessageHandlerService.getMessageConverter().toMessage(securityToken,
messageProperties); messageProperties);

View File

@@ -35,8 +35,8 @@ import ru.yandex.qatools.allure.annotations.Stories;
org.eclipse.hawkbit.RepositoryApplicationConfiguration.class }) org.eclipse.hawkbit.RepositoryApplicationConfiguration.class })
public class PropertyBasedArtifactUrlHandlerTest extends AbstractIntegrationTestWithMongoDB { public class PropertyBasedArtifactUrlHandlerTest extends AbstractIntegrationTestWithMongoDB {
private static final String HTTPS_LOCALHOST = "https://localhost:8080/"; private static final String HTTPS_LOCALHOST = "https://localhost/";
private static final String HTTP_LOCALHOST = "http://localhost:8080/"; private static final String HTTP_LOCALHOST = "http://localhost/";
@Autowired @Autowired
private ArtifactUrlHandler urlHandlerProperties; private ArtifactUrlHandler urlHandlerProperties;

View File

@@ -135,7 +135,7 @@ public class TenantSecurityToken {
* the SHA1 key of the file to obtain * the SHA1 key of the file to obtain
* @return the {@link FileResource} with SHA1 key set * @return the {@link FileResource} with SHA1 key set
*/ */
public static FileResource sha1(final String sha1) { public static FileResource createFileResourceBySha1(final String sha1) {
final FileResource resource = new FileResource(); final FileResource resource = new FileResource();
resource.sha1 = sha1; resource.sha1 = sha1;
return resource; return resource;
@@ -148,7 +148,7 @@ public class TenantSecurityToken {
* the filename of the file to obtain * the filename of the file to obtain
* @return the {@link FileResource} with filename set * @return the {@link FileResource} with filename set
*/ */
public static FileResource filename(final String filename) { public static FileResource createFileResourceByFilename(final String filename) {
final FileResource resource = new FileResource(); final FileResource resource = new FileResource();
resource.filename = filename; resource.filename = filename;
return resource; return resource;

View File

@@ -47,7 +47,7 @@ import com.google.common.collect.UnmodifiableIterator;
*/ */
public abstract class AbstractHttpControllerAuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter { public abstract class AbstractHttpControllerAuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter {
private static final Logger LOGGER = LoggerFactory.getLogger(AbstractHttpControllerAuthenticationFilter.class); private static final Logger LOG = LoggerFactory.getLogger(AbstractHttpControllerAuthenticationFilter.class);
private static final String TENANT_PLACE_HOLDER = "tenant"; private static final String TENANT_PLACE_HOLDER = "tenant";
private static final String CONTROLLER_ID_PLACE_HOLDER = "controllerId"; private static final String CONTROLLER_ID_PLACE_HOLDER = "controllerId";
@@ -73,10 +73,12 @@ public abstract class AbstractHttpControllerAuthenticationFilter extends Abstrac
/** /**
* Constructor for sub-classes. * Constructor for sub-classes.
* *
* @param systemManagement * @param tenantConfigurationManagement
* the system management service * the tenant configuration service
* @param tenantAware * @param tenantAware
* the tenant aware service * the tenant aware service
* @param systemSecurityContext
* the system secruity context
*/ */
public AbstractHttpControllerAuthenticationFilter(final TenantConfigurationManagement tenantConfigurationManagement, public AbstractHttpControllerAuthenticationFilter(final TenantConfigurationManagement tenantConfigurationManagement,
final TenantAware tenantAware, final SystemSecurityContext systemSecurityContext) { final TenantAware tenantAware, final SystemSecurityContext systemSecurityContext) {
@@ -136,28 +138,28 @@ public abstract class AbstractHttpControllerAuthenticationFilter extends Abstrac
final String requestURI = request.getRequestURI(); final String requestURI = request.getRequestURI();
if (pathExtractor.match(request.getContextPath() + CONTROLLER_REQUEST_ANT_PATTERN, requestURI)) { if (pathExtractor.match(request.getContextPath() + CONTROLLER_REQUEST_ANT_PATTERN, requestURI)) {
LOGGER.debug("retrieving principal from URI request {}", requestURI); LOG.debug("retrieving principal from URI request {}", requestURI);
final Map<String, String> extractUriTemplateVariables = pathExtractor final Map<String, String> extractUriTemplateVariables = pathExtractor
.extractUriTemplateVariables(request.getContextPath() + CONTROLLER_REQUEST_ANT_PATTERN, requestURI); .extractUriTemplateVariables(request.getContextPath() + CONTROLLER_REQUEST_ANT_PATTERN, requestURI);
final String controllerId = extractUriTemplateVariables.get(CONTROLLER_ID_PLACE_HOLDER); final String controllerId = extractUriTemplateVariables.get(CONTROLLER_ID_PLACE_HOLDER);
final String tenant = extractUriTemplateVariables.get(TENANT_PLACE_HOLDER); final String tenant = extractUriTemplateVariables.get(TENANT_PLACE_HOLDER);
if (LOGGER.isTraceEnabled()) { if (LOG.isTraceEnabled()) {
LOGGER.trace("Parsed tenant {} and controllerId {} from path request {}", tenant, controllerId, LOG.trace("Parsed tenant {} and controllerId {} from path request {}", tenant, controllerId,
requestURI); requestURI);
} }
return createTenantSecruityTokenVariables(request, tenant, controllerId); return createTenantSecruityTokenVariables(request, tenant, controllerId);
} else if (pathExtractor.match(request.getContextPath() + CONTROLLER_DL_REQUEST_ANT_PATTERN, requestURI)) { } else if (pathExtractor.match(request.getContextPath() + CONTROLLER_DL_REQUEST_ANT_PATTERN, requestURI)) {
LOGGER.debug("retrieving path variables from URI request {}", requestURI); LOG.debug("retrieving path variables from URI request {}", requestURI);
final Map<String, String> extractUriTemplateVariables = pathExtractor.extractUriTemplateVariables( final Map<String, String> extractUriTemplateVariables = pathExtractor.extractUriTemplateVariables(
request.getContextPath() + CONTROLLER_DL_REQUEST_ANT_PATTERN, requestURI); request.getContextPath() + CONTROLLER_DL_REQUEST_ANT_PATTERN, requestURI);
final String tenant = extractUriTemplateVariables.get(TENANT_PLACE_HOLDER); final String tenant = extractUriTemplateVariables.get(TENANT_PLACE_HOLDER);
if (LOGGER.isTraceEnabled()) { if (LOG.isTraceEnabled()) {
LOGGER.trace("Parsed tenant {} from path request {}", tenant, requestURI); LOG.trace("Parsed tenant {} from path request {}", tenant, requestURI);
} }
return createTenantSecruityTokenVariables(request, tenant, "anonymous"); return createTenantSecruityTokenVariables(request, tenant, "anonymous");
} else { } else {
if (LOGGER.isTraceEnabled()) { if (LOG.isTraceEnabled()) {
LOGGER.trace("request {} does not match the path pattern {}, request gets ignored", requestURI, LOG.trace("request {} does not match the path pattern {}, request gets ignored", requestURI,
CONTROLLER_REQUEST_ANT_PATTERN); CONTROLLER_REQUEST_ANT_PATTERN);
} }
return null; return null;
@@ -166,7 +168,8 @@ public abstract class AbstractHttpControllerAuthenticationFilter extends Abstrac
private TenantSecurityToken createTenantSecruityTokenVariables(final HttpServletRequest request, private TenantSecurityToken createTenantSecruityTokenVariables(final HttpServletRequest request,
final String tenant, final String controllerId) { final String tenant, final String controllerId) {
final TenantSecurityToken secruityToken = new TenantSecurityToken(tenant, controllerId, FileResource.sha1("")); final TenantSecurityToken secruityToken = new TenantSecurityToken(tenant, controllerId,
FileResource.createFileResourceBySha1(""));
final UnmodifiableIterator<String> forEnumeration = Iterators.forEnumeration(request.getHeaderNames()); final UnmodifiableIterator<String> forEnumeration = Iterators.forEnumeration(request.getHeaderNames());
forEnumeration.forEachRemaining(header -> secruityToken.getHeaders().put(header, request.getHeader(header))); forEnumeration.forEachRemaining(header -> secruityToken.getHeaders().put(header, request.getHeader(header)));
return secruityToken; return secruityToken;

View File

@@ -23,14 +23,10 @@ import org.springframework.util.AntPathMatcher;
* tenant from a request pattern {@link #TENANT_AWARE_CONTROLLER_PATTERN} and * tenant from a request pattern {@link #TENANT_AWARE_CONTROLLER_PATTERN} and
* stores the retrieved tenant in the {@link TenantAwareAuthenticationDetails}. * stores the retrieved tenant in the {@link TenantAwareAuthenticationDetails}.
* *
*
*/ */
public class ControllerTenantAwareAuthenticationDetailsSource public class ControllerTenantAwareAuthenticationDetailsSource
implements AuthenticationDetailsSource<HttpServletRequest, TenantAwareAuthenticationDetails> { implements AuthenticationDetailsSource<HttpServletRequest, TenantAwareAuthenticationDetails> {
/**
*
*/
private static final String TENANT_AWARE_CONTROLLER_PATTERN = "/{tenant}/controller/**"; private static final String TENANT_AWARE_CONTROLLER_PATTERN = "/{tenant}/controller/**";
private static final Logger LOGGER = LoggerFactory private static final Logger LOGGER = LoggerFactory
.getLogger(ControllerTenantAwareAuthenticationDetailsSource.class); .getLogger(ControllerTenantAwareAuthenticationDetailsSource.class);
@@ -38,19 +34,12 @@ public class ControllerTenantAwareAuthenticationDetailsSource
private final AntPathMatcher pathExtractor; private final AntPathMatcher pathExtractor;
/** /**
* * Constructor.
*/ */
public ControllerTenantAwareAuthenticationDetailsSource() { public ControllerTenantAwareAuthenticationDetailsSource() {
pathExtractor = new AntPathMatcher(); pathExtractor = new AntPathMatcher();
} }
/*
* (non-Javadoc)
*
* @see
* org.springframework.security.authentication.AuthenticationDetailsSource#
* buildDetails(java. lang.Object)
*/
@Override @Override
public TenantAwareAuthenticationDetails buildDetails(final HttpServletRequest request) { public TenantAwareAuthenticationDetails buildDetails(final HttpServletRequest request) {
return new TenantAwareWebAuthenticationDetails(getTenantFromRequestUri(request), request.getRemoteAddr(), true); return new TenantAwareWebAuthenticationDetails(getTenantFromRequestUri(request), request.getRemoteAddr(), true);

View File

@@ -28,7 +28,7 @@ import org.springframework.security.web.authentication.preauth.AbstractPreAuthen
public class HttpDownloadAuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter { public class HttpDownloadAuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter {
public static final String REQUEST_ID_REGEX_PATTERN = ".*\\/downloadId\\/.*"; public static final String REQUEST_ID_REGEX_PATTERN = ".*\\/downloadId\\/.*";
private static final Logger LOGGER = LoggerFactory.getLogger(HttpDownloadAuthenticationFilter.class); private static final Logger LOG = LoggerFactory.getLogger(HttpDownloadAuthenticationFilter.class);
private final Pattern pattern; private final Pattern pattern;
private final Cache cache; private final Cache cache;
@@ -50,7 +50,7 @@ public class HttpDownloadAuthenticationFilter extends AbstractPreAuthenticatedPr
if (!matcher.matches()) { if (!matcher.matches()) {
return null; return null;
} }
LOGGER.debug("retrieving id from URI request {}", requestURI); LOG.debug("retrieving id from URI request {}", requestURI);
final String[] groups = requestURI.split("\\/"); final String[] groups = requestURI.split("\\/");
final String id = groups[groups.length - 1]; final String id = groups[groups.length - 1];
if (id == null) { if (id == null) {

View File

@@ -27,6 +27,7 @@ public class MgmtArtifactHash {
* Default constructor. * Default constructor.
*/ */
public MgmtArtifactHash() { public MgmtArtifactHash() {
// used for jackson to instantiate
} }
/** /**

View File

@@ -20,6 +20,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
* *
*/ */
@RequestMapping(MgmtRestConstants.SOFTWAREMODULE_V1_REQUEST_MAPPING) @RequestMapping(MgmtRestConstants.SOFTWAREMODULE_V1_REQUEST_MAPPING)
@FunctionalInterface
public interface MgmtDownloadArtifactRestApi { public interface MgmtDownloadArtifactRestApi {
/** /**

View File

@@ -20,6 +20,7 @@ import org.springframework.web.bind.annotation.ResponseBody;
* *
*/ */
@RequestMapping(MgmtRestConstants.DOWNLOAD_ID_V1_REQUEST_MAPPING_BASE) @RequestMapping(MgmtRestConstants.DOWNLOAD_ID_V1_REQUEST_MAPPING_BASE)
@FunctionalInterface
public interface MgmtDownloadRestApi { public interface MgmtDownloadRestApi {
/** /**

View File

@@ -15,6 +15,7 @@ import org.eclipse.hawkbit.artifact.repository.ArtifactRepository;
import org.eclipse.hawkbit.artifact.repository.model.DbArtifact; import org.eclipse.hawkbit.artifact.repository.model.DbArtifact;
import org.eclipse.hawkbit.cache.CacheConstants; import org.eclipse.hawkbit.cache.CacheConstants;
import org.eclipse.hawkbit.cache.DownloadArtifactCache; import org.eclipse.hawkbit.cache.DownloadArtifactCache;
import org.eclipse.hawkbit.cache.DownloadType;
import org.eclipse.hawkbit.mgmt.rest.api.MgmtDownloadRestApi; import org.eclipse.hawkbit.mgmt.rest.api.MgmtDownloadRestApi;
import org.eclipse.hawkbit.rest.util.RequestResponseContextHolder; import org.eclipse.hawkbit.rest.util.RequestResponseContextHolder;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -73,14 +74,11 @@ public class MgmtDownloadResource implements MgmtDownloadRestApi {
final DownloadArtifactCache artifactCache = (DownloadArtifactCache) cacheWrapper.get(); final DownloadArtifactCache artifactCache = (DownloadArtifactCache) cacheWrapper.get();
DbArtifact artifact = null; DbArtifact artifact = null;
switch (artifactCache.getDownloadType()) {
case BY_SHA1:
artifact = artifactRepository.getArtifactBySha1(artifactCache.getId());
break;
default: if (DownloadType.BY_SHA1.equals(artifactCache.getDownloadType())) {
artifact = artifactRepository.getArtifactBySha1(artifactCache.getId());
} else {
LOGGER.warn("Download Type {} not supported", artifactCache.getDownloadType()); LOGGER.warn("Download Type {} not supported", artifactCache.getDownloadType());
break;
} }
if (artifact == null) { if (artifact == null) {

View File

@@ -23,7 +23,7 @@ import org.eclipse.hawkbit.tenancy.configuration.TenantConfigurationKey;
* A mapper which maps repository model to RESTful model representation and * A mapper which maps repository model to RESTful model representation and
* back. * back.
*/ */
public class MgmtSystemMapper { public final class MgmtSystemMapper {
private MgmtSystemMapper() { private MgmtSystemMapper() {
// Utility class // Utility class
@@ -51,6 +51,8 @@ public class MgmtSystemMapper {
* maps a TenantConfigurationValue from the repository model to a * maps a TenantConfigurationValue from the repository model to a
* MgmtSystemTenantConfigurationValue, the RESTful model. * MgmtSystemTenantConfigurationValue, the RESTful model.
* *
* @param key
* the key
* @param repoConfValue * @param repoConfValue
* configuration value as repository model * configuration value as repository model
* @return configuration value as RESTful model * @return configuration value as RESTful model

View File

@@ -24,6 +24,7 @@ import org.eclipse.hawkbit.repository.exception.RSQLParameterUnsupportedFieldExc
import org.eclipse.hawkbit.repository.model.Action; import org.eclipse.hawkbit.repository.model.Action;
import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.DistributionSetFilter; import org.eclipse.hawkbit.repository.model.DistributionSetFilter;
import org.eclipse.hawkbit.repository.model.DistributionSetFilter.DistributionSetFilterBuilder;
import org.eclipse.hawkbit.repository.model.DistributionSetMetadata; import org.eclipse.hawkbit.repository.model.DistributionSetMetadata;
import org.eclipse.hawkbit.repository.model.DistributionSetTag; import org.eclipse.hawkbit.repository.model.DistributionSetTag;
import org.eclipse.hawkbit.repository.model.DistributionSetTagAssignmentResult; import org.eclipse.hawkbit.repository.model.DistributionSetTagAssignmentResult;
@@ -32,7 +33,6 @@ import org.eclipse.hawkbit.repository.model.SoftwareModule;
import org.eclipse.hawkbit.repository.model.SoftwareModuleType; import org.eclipse.hawkbit.repository.model.SoftwareModuleType;
import org.eclipse.hawkbit.repository.model.Tag; import org.eclipse.hawkbit.repository.model.Tag;
import org.eclipse.hawkbit.repository.model.Target; import org.eclipse.hawkbit.repository.model.Target;
import org.eclipse.hawkbit.repository.model.DistributionSetFilter.DistributionSetFilterBuilder;
import org.hibernate.validator.constraints.NotEmpty; import org.hibernate.validator.constraints.NotEmpty;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Pageable;
@@ -44,9 +44,6 @@ import org.springframework.security.access.prepost.PreAuthorize;
*/ */
public interface DistributionSetManagement { public interface DistributionSetManagement {
// TODO rename/document the whole with details thing (document what the
// details are and maybe find a better name, e.g. with dependencies?)
/** /**
* Assigns {@link SoftwareModule} to existing {@link DistributionSet}. * Assigns {@link SoftwareModule} to existing {@link DistributionSet}.
* *
@@ -320,7 +317,6 @@ public interface DistributionSetManagement {
@PreAuthorize(SpringEvalExpressions.HAS_AUTH_READ_REPOSITORY) @PreAuthorize(SpringEvalExpressions.HAS_AUTH_READ_REPOSITORY)
List<DistributionSet> findDistributionSetsAll(Collection<Long> dist); List<DistributionSet> findDistributionSetsAll(Collection<Long> dist);
// TODO discuss: use enum instead of the true,false,null switch ?
/** /**
* finds all {@link DistributionSet}s. * finds all {@link DistributionSet}s.
* *

View File

@@ -8,7 +8,7 @@
*/ */
package org.eclipse.hawkbit.repository.eventbus.event; package org.eclipse.hawkbit.repository.eventbus.event;
import org.eclipse.hawkbit.eventbus.event.AbstractEvent; import org.eclipse.hawkbit.eventbus.event.DefaultEvent;
/** /**
* Event declaration for the UI to notify the UI that a rollout has been * Event declaration for the UI to notify the UI that a rollout has been
@@ -17,7 +17,7 @@ import org.eclipse.hawkbit.eventbus.event.AbstractEvent;
* @author Michael Hirsch * @author Michael Hirsch
* *
*/ */
public class RolloutChangeEvent extends AbstractEvent { public class RolloutChangeEvent extends DefaultEvent {
private final Long rolloutId; private final Long rolloutId;

View File

@@ -8,7 +8,7 @@
*/ */
package org.eclipse.hawkbit.repository.eventbus.event; package org.eclipse.hawkbit.repository.eventbus.event;
import org.eclipse.hawkbit.eventbus.event.AbstractEvent; import org.eclipse.hawkbit.eventbus.event.DefaultEvent;
/** /**
* Event declaration for the UI to notify the UI that a rollout has been * Event declaration for the UI to notify the UI that a rollout has been
@@ -17,7 +17,7 @@ import org.eclipse.hawkbit.eventbus.event.AbstractEvent;
* @author Michael Hirsch * @author Michael Hirsch
* *
*/ */
public class RolloutGroupChangeEvent extends AbstractEvent { public class RolloutGroupChangeEvent extends DefaultEvent {
private final Long rolloutId; private final Long rolloutId;
private final Long rolloutGroupId; private final Long rolloutGroupId;

View File

@@ -11,14 +11,14 @@ package org.eclipse.hawkbit.repository.eventbus.event;
import java.net.URI; import java.net.URI;
import java.util.Collection; import java.util.Collection;
import org.eclipse.hawkbit.eventbus.event.AbstractEvent; import org.eclipse.hawkbit.eventbus.event.DefaultEvent;
import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.repository.model.SoftwareModule;
/** /**
* Event that gets sent when a distribution set gets assigned to a target. * Event that gets sent when a distribution set gets assigned to a target.
* *
*/ */
public class TargetAssignDistributionSetEvent extends AbstractEvent { public class TargetAssignDistributionSetEvent extends DefaultEvent {
private final Collection<SoftwareModule> softwareModules; private final Collection<SoftwareModule> softwareModules;
private final String controllerId; private final String controllerId;

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Thrown if artifact deletion failed. * Thrown if artifact deletion failed.
@@ -18,7 +18,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public final class ArtifactDeleteFailedException extends SpServerRtException { public final class ArtifactDeleteFailedException extends AbstractServerRtException {
/** /**
* *
*/ */

View File

@@ -9,14 +9,14 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* *
* *
* *
*/ */
public final class ArtifactUploadFailedException extends SpServerRtException { public final class ArtifactUploadFailedException extends AbstractServerRtException {
/** /**
* *

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Thrown if cancelation of actions is performened where the action is not * Thrown if cancelation of actions is performened where the action is not
@@ -19,7 +19,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public final class CancelActionNotAllowedException extends SpServerRtException { public final class CancelActionNotAllowedException extends AbstractServerRtException {
/** /**
* *
*/ */

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* {@link ConcurrentModificationException} is thrown when a given entity in's * {@link ConcurrentModificationException} is thrown when a given entity in's
@@ -19,7 +19,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public class ConcurrentModificationException extends SpServerRtException { public class ConcurrentModificationException extends AbstractServerRtException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final SpServerError THIS_ERROR = SpServerError.SP_REPO_CONCURRENT_MODIFICATION; private static final SpServerError THIS_ERROR = SpServerError.SP_REPO_CONCURRENT_MODIFICATION;

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Thrown if DS creation failed. * Thrown if DS creation failed.
@@ -18,7 +18,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public final class DistributionSetCreationFailedMissingMandatoryModuleException extends SpServerRtException { public final class DistributionSetCreationFailedMissingMandatoryModuleException extends AbstractServerRtException {
/** /**
* *
*/ */

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.DistributionSetType; import org.eclipse.hawkbit.repository.model.DistributionSetType;
@@ -21,7 +21,7 @@ import org.eclipse.hawkbit.repository.model.DistributionSetType;
* *
* *
*/ */
public class DistributionSetTypeUndefinedException extends SpServerRtException { public class DistributionSetTypeUndefinedException extends AbstractServerRtException {
/** /**
* *
*/ */

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* the {@link EntityAlreadyExistsException} is thrown when a entity is tried to * the {@link EntityAlreadyExistsException} is thrown when a entity is tried to
@@ -18,7 +18,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public class EntityAlreadyExistsException extends SpServerRtException { public class EntityAlreadyExistsException extends AbstractServerRtException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final SpServerError THIS_ERROR = SpServerError.SP_REPO_ENTITY_ALRREADY_EXISTS; private static final SpServerError THIS_ERROR = SpServerError.SP_REPO_ENTITY_ALRREADY_EXISTS;

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* The {@link EntityLockedException} is thrown when an entity has been locked by * The {@link EntityLockedException} is thrown when an entity has been locked by
@@ -18,7 +18,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public class EntityLockedException extends SpServerRtException { public class EntityLockedException extends AbstractServerRtException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final SpServerError THIS_ERROR = SpServerError.SP_ENTITY_LOCKED; private static final SpServerError THIS_ERROR = SpServerError.SP_ENTITY_LOCKED;

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* the {@link EntityNotFoundException} is thrown when a entity is tried find but * the {@link EntityNotFoundException} is thrown when a entity is tried find but
@@ -18,7 +18,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public class EntityNotFoundException extends SpServerRtException { public class EntityNotFoundException extends AbstractServerRtException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final SpServerError THIS_ERROR = SpServerError.SP_REPO_ENTITY_NOT_EXISTS; private static final SpServerError THIS_ERROR = SpServerError.SP_REPO_ENTITY_NOT_EXISTS;

View File

@@ -9,13 +9,13 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* the {@link EntityReadOnlyException} is thrown when a entity is in read only * the {@link EntityReadOnlyException} is thrown when a entity is in read only
* mode and a user tries to change it. * mode and a user tries to change it.
*/ */
public class EntityReadOnlyException extends SpServerRtException { public class EntityReadOnlyException extends AbstractServerRtException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final SpServerError THIS_ERROR = SpServerError.SP_REPO_ENTITY_READ_ONLY; private static final SpServerError THIS_ERROR = SpServerError.SP_REPO_ENTITY_READ_ONLY;

View File

@@ -9,14 +9,14 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Thrown when force quitting an actions is not allowed. e.g. the action is not * Thrown when force quitting an actions is not allowed. e.g. the action is not
* active or it is not canceled before. * active or it is not canceled before.
* *
*/ */
public final class ForceQuitActionNotAllowedException extends SpServerRtException { public final class ForceQuitActionNotAllowedException extends AbstractServerRtException {
/** /**
* *
*/ */

View File

@@ -9,14 +9,14 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* *
* *
* *
*/ */
public final class GridFSDBFileNotFoundException extends SpServerRtException { public final class GridFSDBFileNotFoundException extends AbstractServerRtException {
/** /**
* *

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Thrown if a distribution set is assigned to a a target that is incomplete * Thrown if a distribution set is assigned to a a target that is incomplete
@@ -19,7 +19,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public final class IncompleteDistributionSetException extends SpServerRtException { public final class IncompleteDistributionSetException extends AbstractServerRtException {
/** /**
* *
*/ */

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Exception which is thrown in case the current security context object does * Exception which is thrown in case the current security context object does
@@ -18,7 +18,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public class InsufficientPermissionException extends SpServerRtException { public class InsufficientPermissionException extends AbstractServerRtException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Thrown if MD5 checksum check fails. * Thrown if MD5 checksum check fails.
@@ -18,7 +18,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public class InvalidMD5HashException extends SpServerRtException { public class InvalidMD5HashException extends AbstractServerRtException {
/** /**
* *
*/ */

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Thrown if SHA1 checksum check fails. * Thrown if SHA1 checksum check fails.
@@ -18,7 +18,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public class InvalidSHA1HashException extends SpServerRtException { public class InvalidSHA1HashException extends AbstractServerRtException {
/** /**
* *
*/ */

View File

@@ -9,12 +9,12 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Exception which is thrown when trying to set an invalid target address. * Exception which is thrown when trying to set an invalid target address.
*/ */
public class InvalidTargetAddressException extends SpServerRtException { public class InvalidTargetAddressException extends AbstractServerRtException {
/** /**
* *

View File

@@ -9,13 +9,13 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Thrown if a multi part exception occurred. * Thrown if a multi part exception occurred.
* *
*/ */
public final class MultiPartFileUploadException extends SpServerRtException { public final class MultiPartFileUploadException extends AbstractServerRtException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Exception used by the REST API in case of RSQL search filter query. * Exception used by the REST API in case of RSQL search filter query.
@@ -18,7 +18,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public class RSQLParameterSyntaxException extends SpServerRtException { public class RSQLParameterSyntaxException extends AbstractServerRtException {
/** /**
* *

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Exception used by the REST API in case of invalid field name in the rsql * Exception used by the REST API in case of invalid field name in the rsql
@@ -19,7 +19,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public class RSQLParameterUnsupportedFieldException extends SpServerRtException { public class RSQLParameterUnsupportedFieldException extends AbstractServerRtException {
/** /**
* *

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* the {@link RolloutIllegalStateException} is thrown when a rollout is changing * the {@link RolloutIllegalStateException} is thrown when a rollout is changing
@@ -17,7 +17,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* rollout, or trying to resume a already finished rollout. * rollout, or trying to resume a already finished rollout.
* *
*/ */
public class RolloutIllegalStateException extends SpServerRtException { public class RolloutIllegalStateException extends AbstractServerRtException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final SpServerError THIS_ERROR = SpServerError.SP_ROLLOUT_ILLEGAL_STATE; private static final SpServerError THIS_ERROR = SpServerError.SP_ROLLOUT_ILLEGAL_STATE;

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* the {@link TenantNotExistException} is thrown when e.g. a controller tries to * the {@link TenantNotExistException} is thrown when e.g. a controller tries to
@@ -20,7 +20,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public class TenantNotExistException extends SpServerRtException { public class TenantNotExistException extends AbstractServerRtException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final SpServerError THIS_ERROR = SpServerError.SP_REPO_TENANT_NOT_EXISTS; private static final SpServerError THIS_ERROR = SpServerError.SP_REPO_TENANT_NOT_EXISTS;

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Thrown if too many status entries have been inserted. * Thrown if too many status entries have been inserted.
@@ -18,7 +18,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public final class ToManyAttributeEntriesException extends SpServerRtException { public final class ToManyAttributeEntriesException extends AbstractServerRtException {
/** /**
* *
*/ */

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Thrown if too many status entries have been inserted. * Thrown if too many status entries have been inserted.
@@ -18,7 +18,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public final class ToManyStatusEntriesException extends SpServerRtException { public final class ToManyStatusEntriesException extends AbstractServerRtException {
/** /**
* *
*/ */

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.repository.exception; package org.eclipse.hawkbit.repository.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
import org.eclipse.hawkbit.repository.model.DistributionSet; import org.eclipse.hawkbit.repository.model.DistributionSet;
import org.eclipse.hawkbit.repository.model.DistributionSetType; import org.eclipse.hawkbit.repository.model.DistributionSetType;
import org.eclipse.hawkbit.repository.model.SoftwareModule; import org.eclipse.hawkbit.repository.model.SoftwareModule;
@@ -23,7 +23,7 @@ import org.eclipse.hawkbit.repository.model.SoftwareModule;
* *
* *
*/ */
public class UnsupportedSoftwareModuleForThisDistributionSetException extends SpServerRtException { public class UnsupportedSoftwareModuleForThisDistributionSetException extends AbstractServerRtException {
/** /**
* *
*/ */

View File

@@ -27,43 +27,84 @@ import org.eclipse.hawkbit.repository.model.EntityInterceptor;
*/ */
public class EntityInterceptorListener { public class EntityInterceptorListener {
/**
* Callback for lifecyle event <i>pre persist</i>.
*
* @param entity
* the JPA entity which this listener is associated with
*/
@PrePersist @PrePersist
protected void prePersist(final Object entity) { public void prePersist(final Object entity) {
notifyAll(interceptor -> interceptor.prePersist(entity)); notifyAll(interceptor -> interceptor.prePersist(entity));
} }
/**
* Callback for lifecyle event <i>post persist</i>.
*
* @param entity
* the JPA entity which this listener is associated with
*/
@PostPersist @PostPersist
protected void postPersist(final Object entity) { public void postPersist(final Object entity) {
notifyAll(interceptor -> interceptor.postPersist(entity)); notifyAll(interceptor -> interceptor.postPersist(entity));
} }
/**
* Callback for lifecyle event <i>post remove</i>.
*
* @param entity
* the JPA entity which this listener is associated with
*/
@PostRemove @PostRemove
protected void postRemove(final Object entity) { public void postRemove(final Object entity) {
notifyAll(interceptor -> interceptor.postRemove(entity)); notifyAll(interceptor -> interceptor.postRemove(entity));
} }
/**
* Callback for lifecyle event <i>pre remove</i>.
*
* @param entity
* the JPA entity which this listener is associated with
*/
@PreRemove @PreRemove
protected void preRemove(final Object entity) { public void preRemove(final Object entity) {
notifyAll(interceptor -> interceptor.preRemove(entity)); notifyAll(interceptor -> interceptor.preRemove(entity));
} }
/**
* Callback for lifecyle event <i>post load</i>.
*
* @param entity
* the JPA entity which this listener is associated with
*/
@PostLoad @PostLoad
protected void postLoad(final Object entity) { public void postLoad(final Object entity) {
notifyAll(interceptor -> interceptor.postLoad(entity)); notifyAll(interceptor -> interceptor.postLoad(entity));
} }
/**
* Callback for lifecyle event <i>pre update</i>.
*
* @param entity
* the JPA entity which this listener is associated with
*/
@PreUpdate @PreUpdate
protected void preUpdate(final Object entity) { public void preUpdate(final Object entity) {
notifyAll(interceptor -> interceptor.preUpdate(entity)); notifyAll(interceptor -> interceptor.preUpdate(entity));
} }
/**
* Callback for lifecyle event <i>post update</i>.
*
* @param entity
* the JPA entity which this listener is associated with
*/
@PostUpdate @PostUpdate
protected void postUpdate(final Object entity) { public void postUpdate(final Object entity) {
notifyAll(interceptor -> interceptor.postUpdate(entity)); notifyAll(interceptor -> interceptor.postUpdate(entity));
} }
private void notifyAll(final Consumer<? super EntityInterceptor> action) { private static void notifyAll(final Consumer<? super EntityInterceptor> action) {
EntityInterceptorHolder.getInstance().getEntityInterceptors().forEach(action); EntityInterceptorHolder.getInstance().getEntityInterceptors().forEach(action);
} }
} }

View File

@@ -17,7 +17,7 @@ import org.hamcrest.Matchers;
/** /**
* Matcher for {@link BaseEntity}. * Matcher for {@link BaseEntity}.
*/ */
public class BaseEntityMatcher { public final class BaseEntityMatcher {
private BaseEntityMatcher() { private BaseEntityMatcher() {
} }

View File

@@ -226,7 +226,7 @@ public abstract class AbstractIntegrationTest implements EnvironmentAware {
createTestdatabaseAndStart(); createTestdatabaseAndStart();
} }
private static void createTestdatabaseAndStart() { private static synchronized void createTestdatabaseAndStart() {
if ("MYSQL".equals(System.getProperty("spring.jpa.database"))) { if ("MYSQL".equals(System.getProperty("spring.jpa.database"))) {
tesdatabase = new CIMySqlTestDatabase(); tesdatabase = new CIMySqlTestDatabase();
tesdatabase.before(); tesdatabase.before();

View File

@@ -14,7 +14,7 @@ import java.net.ServerSocket;
/** /**
* *
* * Look for a free port.
*/ */
public class FreePortFileWriter { public class FreePortFileWriter {
@@ -24,7 +24,9 @@ public class FreePortFileWriter {
/** /**
* @param from * @param from
* port range from (start point)
* @param to * @param to
* port range to (end point)
*/ */
public FreePortFileWriter(final int from, final int to, final String filePortPath) { public FreePortFileWriter(final int from, final int to, final String filePortPath) {
this.from = from; this.from = from;
@@ -51,25 +53,21 @@ public class FreePortFileWriter {
portFile.getParentFile().mkdirs(); portFile.getParentFile().mkdirs();
if (portFile.exists()) { if (portFile.exists()) {
return false; return false;
} else {
boolean isFree = false;
final ServerSocket sock = new ServerSocket();
sock.setReuseAddress(true);
sock.bind(new InetSocketAddress(port));
if (portFile.createNewFile()) {
portFile.deleteOnExit();
isFree = true;
}
sock.close();
// is free:
return isFree;
// We rely on an exception thrown to determine availability or
// not availability.
} }
} catch (final Exception e) { boolean isFree = false;
// not free. final ServerSocket sock = new ServerSocket();
sock.setReuseAddress(true);
sock.bind(new InetSocketAddress(port));
if (portFile.createNewFile()) {
portFile.deleteOnExit();
isFree = true;
}
sock.close();
return isFree;
// We rely on an exception thrown to determine availability or
// not availability and don't want to log the exception.
} catch (@SuppressWarnings({ "squid:S2221", "squid:S1166" }) final Exception e) {
return false; return false;
} }
} }
} }

View File

@@ -13,11 +13,14 @@ import java.util.List;
import org.eclipse.hawkbit.cache.TenantAwareCacheManager; import org.eclipse.hawkbit.cache.TenantAwareCacheManager;
import org.eclipse.hawkbit.repository.SystemManagement; import org.eclipse.hawkbit.repository.SystemManagement;
import org.eclipse.hawkbit.security.SystemSecurityContext; import org.eclipse.hawkbit.security.SystemSecurityContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
public class JpaTestRepositoryManagement implements TestRepositoryManagement { public class JpaTestRepositoryManagement implements TestRepositoryManagement {
private static final Logger LOGGER = LoggerFactory.getLogger(JpaTestRepositoryManagement.class);
@Autowired @Autowired
private TenantAwareCacheManager cacheManager; private TenantAwareCacheManager cacheManager;
@@ -28,6 +31,7 @@ public class JpaTestRepositoryManagement implements TestRepositoryManagement {
private SystemManagement systemManagement; private SystemManagement systemManagement;
@Override @Override
@Transactional
public void clearTestRepository() { public void clearTestRepository() {
deleteAllRepos(); deleteAllRepos();
cacheManager.getDirectCacheNames().forEach(name -> cacheManager.getDirectCache(name).clear()); cacheManager.getDirectCacheNames().forEach(name -> cacheManager.getDirectCache(name).clear());
@@ -43,7 +47,7 @@ public class JpaTestRepositoryManagement implements TestRepositoryManagement {
return null; return null;
}); });
} catch (final Exception e) { } catch (final Exception e) {
e.printStackTrace(); LOGGER.error("Error hile delete tenant", e);
} }
}); });
} }

View File

@@ -10,10 +10,10 @@ package org.eclipse.hawkbit.repository.test.util;
import java.io.InputStream; import java.io.InputStream;
import java.nio.charset.Charset; import java.nio.charset.Charset;
import java.security.SecureRandom;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Random;
import java.util.UUID; import java.util.UUID;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
@@ -191,16 +191,17 @@ public class TestdataFactory {
public DistributionSet createDistributionSet(final String prefix, final String version, public DistributionSet createDistributionSet(final String prefix, final String version,
final boolean isRequiredMigrationStep) { final boolean isRequiredMigrationStep) {
final SoftwareModule appMod = softwareManagement.createSoftwareModule(entityFactory.generateSoftwareModule( final SoftwareModule appMod = softwareManagement.createSoftwareModule(
findOrCreateSoftwareModuleType(SM_TYPE_APP, Integer.MAX_VALUE), prefix + SM_TYPE_APP, entityFactory.generateSoftwareModule(findOrCreateSoftwareModuleType(SM_TYPE_APP, Integer.MAX_VALUE),
version + "." + new Random().nextInt(100), LOREM.words(20), prefix + " vendor Limited, California")); prefix + SM_TYPE_APP, version + "." + new SecureRandom().nextInt(100), LOREM.words(20),
prefix + " vendor Limited, California"));
final SoftwareModule runtimeMod = softwareManagement final SoftwareModule runtimeMod = softwareManagement
.createSoftwareModule(entityFactory.generateSoftwareModule(findOrCreateSoftwareModuleType(SM_TYPE_RT), .createSoftwareModule(entityFactory.generateSoftwareModule(findOrCreateSoftwareModuleType(SM_TYPE_RT),
prefix + "app runtime", version + "." + new Random().nextInt(100), LOREM.words(20), prefix + "app runtime", version + "." + new SecureRandom().nextInt(100), LOREM.words(20),
prefix + " vendor GmbH, Stuttgart, Germany")); prefix + " vendor GmbH, Stuttgart, Germany"));
final SoftwareModule osMod = softwareManagement final SoftwareModule osMod = softwareManagement
.createSoftwareModule(entityFactory.generateSoftwareModule(findOrCreateSoftwareModuleType(SM_TYPE_OS), .createSoftwareModule(entityFactory.generateSoftwareModule(findOrCreateSoftwareModuleType(SM_TYPE_OS),
prefix + " Firmware", version + "." + new Random().nextInt(100), LOREM.words(20), prefix + " Firmware", version + "." + new SecureRandom().nextInt(100), LOREM.words(20),
prefix + " vendor Limited Inc, California")); prefix + " vendor Limited Inc, California"));
return distributionSetManagement return distributionSetManagement

View File

@@ -16,7 +16,6 @@ import java.util.List;
import java.util.concurrent.Callable; import java.util.concurrent.Callable;
import org.eclipse.hawkbit.im.authentication.SpPermission; import org.eclipse.hawkbit.im.authentication.SpPermission;
import org.eclipse.hawkbit.im.authentication.SpPermission.SpringEvalExpressions;
import org.eclipse.hawkbit.im.authentication.TenantAwareAuthenticationDetails; import org.eclipse.hawkbit.im.authentication.TenantAwareAuthenticationDetails;
import org.eclipse.hawkbit.repository.jpa.model.helper.SystemManagementHolder; import org.eclipse.hawkbit.repository.jpa.model.helper.SystemManagementHolder;
import org.junit.rules.TestRule; import org.junit.rules.TestRule;
@@ -29,16 +28,12 @@ import org.springframework.security.core.context.SecurityContextHolder;
public class WithSpringAuthorityRule implements TestRule { public class WithSpringAuthorityRule implements TestRule {
/*
* (non-Javadoc)
*
* @see org.junit.rules.TestRule#apply(org.junit.runners.model.Statement,
* org.junit.runner.Description)
*/
@Override @Override
public Statement apply(final Statement base, final Description description) { public Statement apply(final Statement base, final Description description) {
return new Statement() { return new Statement() {
@Override @Override
// throwable comes from jnuit evaluate signature
@SuppressWarnings("squid:S00112")
public void evaluate() throws Throwable { public void evaluate() throws Throwable {
final SecurityContext oldContext = before(description); final SecurityContext oldContext = before(description);
try { try {
@@ -50,7 +45,7 @@ public class WithSpringAuthorityRule implements TestRule {
}; };
} }
private SecurityContext before(final Description description) throws Throwable { private SecurityContext before(final Description description) {
final SecurityContext oldContext = SecurityContextHolder.getContext(); final SecurityContext oldContext = SecurityContextHolder.getContext();
WithUser annotation = description.getAnnotation(WithUser.class); WithUser annotation = description.getAnnotation(WithUser.class);
if (annotation == null) { if (annotation == null) {
@@ -65,18 +60,13 @@ public class WithSpringAuthorityRule implements TestRule {
return oldContext; return oldContext;
} }
/**
* @param annotation
*/
private void setSecurityContext(final WithUser annotation) { private void setSecurityContext(final WithUser annotation) {
SecurityContextHolder.setContext(new SecurityContext() { SecurityContextHolder.setContext(new SecurityContext() {
/**
*
*/
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
@Override @Override
public void setAuthentication(final Authentication authentication) { public void setAuthentication(final Authentication authentication) {
// nothing todo
} }
@Override @Override
@@ -114,7 +104,8 @@ public class WithSpringAuthorityRule implements TestRule {
if (addPermission) { if (addPermission) {
allPermissions.add(permissionName); allPermissions.add(permissionName);
} }
} catch (IllegalArgumentException | IllegalAccessException e) { // don't want to log this exceptions.
} catch (@SuppressWarnings("squid:S1166") IllegalArgumentException | IllegalAccessException e) {
// nope // nope
} }
} }
@@ -134,14 +125,13 @@ public class WithSpringAuthorityRule implements TestRule {
/** /**
* Clears the current security context. * Clears the current security context.
*/ */
public void clear() public void clear() {
{
SecurityContextHolder.clearContext(); SecurityContextHolder.clearContext();
} }
/** /**
* @param callable * @param callable
* @return * @return the callable result
* @throws Exception * @throws Exception
*/ */
public <T> T runAsPrivileged(final Callable<T> callable) throws Exception { public <T> T runAsPrivileged(final Callable<T> callable) throws Exception {
@@ -152,7 +142,7 @@ public class WithSpringAuthorityRule implements TestRule {
* *
* @param withUser * @param withUser
* @param callable * @param callable
* @return * @return callable result
* @throws Exception * @throws Exception
*/ */
public <T> T runAs(final WithUser withUser, final Callable<T> callable) throws Exception { public <T> T runAs(final WithUser withUser, final Callable<T> callable) throws Exception {
@@ -168,14 +158,12 @@ public class WithSpringAuthorityRule implements TestRule {
} }
} }
private void createTenant(final String tenantId) throws Exception { private void createTenant(final String tenantId) {
final SecurityContext oldContext = SecurityContextHolder.getContext(); final SecurityContext oldContext = SecurityContextHolder.getContext();
setSecurityContext(privilegedUser()); setSecurityContext(privilegedUser());
try try {
{
SystemManagementHolder.getInstance().getSystemManagement().getTenantMetadata(tenantId); SystemManagementHolder.getInstance().getSystemManagement().getTenantMetadata(tenantId);
}finally } finally {
{
after(oldContext); after(oldContext);
} }
} }
@@ -198,6 +186,15 @@ public class WithSpringAuthorityRule implements TestRule {
public static WithUser withUserAndTenant(final String principal, final String tenant, public static WithUser withUserAndTenant(final String principal, final String tenant,
final boolean autoCreateTenant, final boolean allSpPermission, final String... authorities) { final boolean autoCreateTenant, final boolean allSpPermission, final String... authorities) {
return createWithUser(principal, tenant, autoCreateTenant, allSpPermission, authorities);
}
private static WithUser privilegedUser() {
return createWithUser("bumlux", "default", true, true, new String[] { "ROLE_CONTROLLER", "ROLE_SYSTEM_CODE" });
}
private static WithUser createWithUser(final String principal, final String tenant, final boolean autoCreateTenant,
final boolean allSpPermission, final String... authorities) {
return new WithUser() { return new WithUser() {
@Override @Override
@@ -227,7 +224,7 @@ public class WithSpringAuthorityRule implements TestRule {
@Override @Override
public String[] removeFromAllPermission() { public String[] removeFromAllPermission() {
return null; return new String[0];
} }
@Override @Override
@@ -235,65 +232,10 @@ public class WithSpringAuthorityRule implements TestRule {
return tenant; return tenant;
} }
/*
* (non-Javadoc)
*
* @see org.eclipse.hawkbit.WithUser#autoCreateTenant()
*/
@Override @Override
public boolean autoCreateTenant() { public boolean autoCreateTenant() {
return autoCreateTenant; return autoCreateTenant;
} }
}; };
} }
private static WithUser privilegedUser() {
return new WithUser() {
@Override
public Class<? extends Annotation> annotationType() {
return WithUser.class;
}
@Override
public String principal() {
return "bumlux";
}
@Override
public String credentials() {
return null;
}
@Override
public String[] authorities() {
return new String[] { "ROLE_CONTROLLER", "ROLE_SYSTEM_CODE" };
}
@Override
public boolean allSpPermissions() {
return true;
}
@Override
public String[] removeFromAllPermission() {
return null;
}
@Override
public String tenantId() {
return "default";
}
/*
* (non-Javadoc)
*
* @see org.eclipse.hawkbit.WithUser#autoCreateTenant()
*/
@Override
public boolean autoCreateTenant() {
return true;
}
};
}
} }

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.rest.exception; package org.eclipse.hawkbit.rest.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Exception which is thrown in case an request body is not well formaned and * Exception which is thrown in case an request body is not well formaned and
@@ -19,7 +19,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public class MessageNotReadableException extends SpServerRtException { public class MessageNotReadableException extends AbstractServerRtException {
/** /**
* *

View File

@@ -16,7 +16,7 @@ import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.commons.lang3.exception.ExceptionUtils;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
import org.eclipse.hawkbit.repository.exception.MultiPartFileUploadException; import org.eclipse.hawkbit.repository.exception.MultiPartFileUploadException;
import org.eclipse.hawkbit.rest.json.model.ExceptionInfo; import org.eclipse.hawkbit.rest.json.model.ExceptionInfo;
import org.slf4j.Logger; import org.slf4j.Logger;
@@ -75,7 +75,7 @@ public class ResponseExceptionHandler {
} }
/** /**
* method for handling exception of type SpServerRtException. Called by the * method for handling exception of type AbstractServerRtException. Called by the
* Spring-Framework for exception handling. * Spring-Framework for exception handling.
* *
* @param request * @param request
@@ -86,14 +86,14 @@ public class ResponseExceptionHandler {
* @return the entity to be responded containing the exception information * @return the entity to be responded containing the exception information
* as entity. * as entity.
*/ */
@ExceptionHandler(SpServerRtException.class) @ExceptionHandler(AbstractServerRtException.class)
public ResponseEntity<ExceptionInfo> handleSpServerRtExceptions(final HttpServletRequest request, public ResponseEntity<ExceptionInfo> handleSpServerRtExceptions(final HttpServletRequest request,
final Exception ex) { final Exception ex) {
logRequest(request, ex); logRequest(request, ex);
final ExceptionInfo response = createExceptionInfo(ex); final ExceptionInfo response = createExceptionInfo(ex);
final HttpStatus responseStatus; final HttpStatus responseStatus;
if (ex instanceof SpServerRtException) { if (ex instanceof AbstractServerRtException) {
responseStatus = getStatusOrDefault(((SpServerRtException) ex).getError()); responseStatus = getStatusOrDefault(((AbstractServerRtException) ex).getError());
} else { } else {
responseStatus = DEFAULT_RESPONSE_STATUS; responseStatus = DEFAULT_RESPONSE_STATUS;
} }
@@ -152,8 +152,8 @@ public class ResponseExceptionHandler {
final ExceptionInfo response = new ExceptionInfo(); final ExceptionInfo response = new ExceptionInfo();
response.setMessage(ex.getMessage()); response.setMessage(ex.getMessage());
response.setExceptionClass(ex.getClass().getName()); response.setExceptionClass(ex.getClass().getName());
if (ex instanceof SpServerRtException) { if (ex instanceof AbstractServerRtException) {
response.setErrorCode(((SpServerRtException) ex).getError().getKey()); response.setErrorCode(((AbstractServerRtException) ex).getError().getKey());
} }
return response; return response;

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.rest.exception; package org.eclipse.hawkbit.rest.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Exception used by the REST API in case of invalid sort parameter syntax. * Exception used by the REST API in case of invalid sort parameter syntax.
@@ -18,7 +18,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public class SortParameterSyntaxErrorException extends SpServerRtException { public class SortParameterSyntaxErrorException extends AbstractServerRtException {
/** /**
* *

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.rest.exception; package org.eclipse.hawkbit.rest.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Exception used by the REST API in case of invalid sort parameter direction * Exception used by the REST API in case of invalid sort parameter direction
@@ -19,7 +19,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public class SortParameterUnsupportedDirectionException extends SpServerRtException { public class SortParameterUnsupportedDirectionException extends AbstractServerRtException {
/** /**
* *

View File

@@ -9,7 +9,7 @@
package org.eclipse.hawkbit.rest.exception; package org.eclipse.hawkbit.rest.exception;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Exception used by the REST API in case of invalid field name in the sort * Exception used by the REST API in case of invalid field name in the sort
@@ -19,7 +19,7 @@ import org.eclipse.hawkbit.exception.SpServerRtException;
* *
* *
*/ */
public class SortParameterUnsupportedFieldException extends SpServerRtException { public class SortParameterUnsupportedFieldException extends AbstractServerRtException {
/** /**
* *

View File

@@ -69,13 +69,10 @@ public class ByteRange {
return total; return total;
} }
/*
* (non-Javadoc)
*
* @see java.lang.Object#hashCode()
*/
@Override @Override
public int hashCode() { // NOSONAR - as this is generated // NOSONAR - as this is generated
@SuppressWarnings("squid:S864")
public int hashCode() {
final int prime = 31; final int prime = 31;
int result = 1; int result = 1;
result = prime * result + (int) (end ^ end >>> 32); result = prime * result + (int) (end ^ end >>> 32);
@@ -85,11 +82,6 @@ public class ByteRange {
return result; return result;
} }
/*
* (non-Javadoc)
*
* @see java.lang.Object#equals(java.lang.Object)
*/
@Override @Override
public boolean equals(final Object obj) { // NOSONAR - as this is generated public boolean equals(final Object obj) { // NOSONAR - as this is generated
if (this == obj) { if (this == obj) {

View File

@@ -9,12 +9,12 @@
package org.eclipse.hawkbit.rest.util; package org.eclipse.hawkbit.rest.util;
import org.eclipse.hawkbit.exception.SpServerError; import org.eclipse.hawkbit.exception.SpServerError;
import org.eclipse.hawkbit.exception.SpServerRtException; import org.eclipse.hawkbit.exception.AbstractServerRtException;
/** /**
* Thrown if artifact content streaming to client failed. * Thrown if artifact content streaming to client failed.
*/ */
public final class FileSteamingFailedException extends SpServerRtException { public final class FileSteamingFailedException extends AbstractServerRtException {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;

View File

@@ -185,18 +185,22 @@ public final class SpPermission {
field.setAccessible(true); field.setAccessible(true);
try { try {
final String role = (String) field.get(null); final String role = (String) field.get(null);
if (!(exclusionRoles.contains(role))) { addIfNotExcluded(exclusionRoles, allPermissions, role);
allPermissions.add(role);
}
} catch (final IllegalAccessException e) { } catch (final IllegalAccessException e) {
LOGGER.error(e.getMessage(), e); LOGGER.error(e.getMessage(), e);
} }
} }
} }
return allPermissions; return allPermissions;
} }
private static void addIfNotExcluded(final Collection<String> exclusionRoles, final List<String> allPermissions,
final String role) {
if (!(exclusionRoles.contains(role))) {
allPermissions.add(role);
}
}
/** /**
* Contains all the spring security evaluation expressions for the * Contains all the spring security evaluation expressions for the
* {@link PreAuthorize} annotation for method security. * {@link PreAuthorize} annotation for method security.

View File

@@ -51,7 +51,9 @@ public interface UserAuthenticationFilter {
* @throws ServletException * @throws ServletException
* servlet exception * servlet exception
*/ */
// this declaration of multiple checked exception is necessary so it's
// aligned with the servlet API.
@SuppressWarnings("squid:S1160")
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException; throws IOException, ServletException;

View File

@@ -28,11 +28,6 @@ import org.springframework.security.core.context.SecurityContextImpl;
*/ */
public class SecurityContextTenantAware implements TenantAware { public class SecurityContextTenantAware implements TenantAware {
/*
* (non-Javadoc)
*
* @see org.eclipse.hawkbit.server.tenancy.TenantAware#getCurrentTenantId()
*/
@Override @Override
public String getCurrentTenant() { public String getCurrentTenant() {
final SecurityContext context = SecurityContextHolder.getContext(); final SecurityContext context = SecurityContextHolder.getContext();
@@ -56,7 +51,7 @@ public class SecurityContextTenantAware implements TenantAware {
} }
} }
private SecurityContext buildSecurityContext(final String tenant) { private static SecurityContext buildSecurityContext(final String tenant) {
final SecurityContextImpl securityContext = new SecurityContextImpl(); final SecurityContextImpl securityContext = new SecurityContextImpl();
securityContext.setAuthentication( securityContext.setAuthentication(
new AuthenticationDelegate(SecurityContextHolder.getContext().getAuthentication(), tenant)); new AuthenticationDelegate(SecurityContextHolder.getContext().getAuthentication(), tenant));
@@ -68,7 +63,7 @@ public class SecurityContextTenantAware implements TenantAware {
* {@link Authentication} object except setting the details specifically for * {@link Authentication} object except setting the details specifically for
* a specific tenant. * a specific tenant.
*/ */
private class AuthenticationDelegate implements Authentication { private static final class AuthenticationDelegate implements Authentication {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private final Authentication delegate; private final Authentication delegate;

View File

@@ -29,12 +29,12 @@ import org.springframework.stereotype.Service;
import com.google.common.base.Throwables; import com.google.common.base.Throwables;
/** /**
* * A Service which provide to run system code.
*/ */
@Service @Service
public class SystemSecurityContext { public class SystemSecurityContext {
private static final Logger logger = LoggerFactory.getLogger(SystemSecurityContext.class); private static final Logger LOG = LoggerFactory.getLogger(SystemSecurityContext.class);
private final TenantAware tenantAware; private final TenantAware tenantAware;
@@ -96,19 +96,21 @@ public class SystemSecurityContext {
public <T> T runAsSystemAsTenant(final Callable<T> callable, final String tenant) { public <T> T runAsSystemAsTenant(final Callable<T> callable, final String tenant) {
final SecurityContext oldContext = SecurityContextHolder.getContext(); final SecurityContext oldContext = SecurityContextHolder.getContext();
try { try {
logger.debug("entering system code execution"); LOG.debug("entering system code execution");
return tenantAware.runAsTenant(tenant, () -> { return tenantAware.runAsTenant(tenant, () -> {
try { try {
setSystemContext(SecurityContextHolder.getContext()); setSystemContext(SecurityContextHolder.getContext());
return callable.call(); return callable.call();
} catch (final Exception e) { // The callable API throws a Exception and not a specific
// one
} catch (@SuppressWarnings("squid:S2221") final Exception e) {
throw Throwables.propagate(e); throw Throwables.propagate(e);
} }
}); });
} finally { } finally {
SecurityContextHolder.setContext(oldContext); SecurityContextHolder.setContext(oldContext);
logger.debug("leaving system code execution"); LOG.debug("leaving system code execution");
} }
} }
@@ -134,7 +136,7 @@ public class SystemSecurityContext {
* {@link SpringEvalExpressions#SYSTEM_ROLE} which is allowed to execute all * {@link SpringEvalExpressions#SYSTEM_ROLE} which is allowed to execute all
* secured methods. * secured methods.
*/ */
public static class SystemCodeAuthentication implements Authentication { public static final class SystemCodeAuthentication implements Authentication {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private static final List<SimpleGrantedAuthority> AUTHORITIES = Collections private static final List<SimpleGrantedAuthority> AUTHORITIES = Collections

Some files were not shown because too many files have changed in this diff Show More