Skip to content

Commit

Permalink
Improved validation of the Device and DeviceConnection clientId
Browse files Browse the repository at this point in the history
Signed-off-by: coduz <alberto.codutti@eurotech.com>
  • Loading branch information
Coduz committed Jan 27, 2020
1 parent a7c4aec commit 7f70b67
Show file tree
Hide file tree
Showing 4 changed files with 46 additions and 8 deletions.
Expand Up @@ -103,6 +103,8 @@ public static DeviceCreator validateCreatePreconditions(DeviceCreator deviceCrea
ArgumentValidator.notNull(deviceCreator, "deviceCreator");
ArgumentValidator.notNull(deviceCreator.getScopeId(), "deviceCreator.scopeId");
ArgumentValidator.notEmptyOrNull(deviceCreator.getClientId(), "deviceCreator.clientId");
ArgumentValidator.lengthRange(deviceCreator.getClientId(), 1, 255, "deviceCreator.clientId");
ArgumentValidator.match(deviceCreator.getClientId(), DeviceValidationRegex.CLIENT_ID, "deviceCreator.clientId");

if (deviceCreator.getGroupId() != null) {
ArgumentValidator.notNull(groupService.find(deviceCreator.getScopeId(), deviceCreator.getGroupId()), "deviceCreator.groupId");
Expand Down
Expand Up @@ -13,12 +13,27 @@

import org.eclipse.kapua.commons.util.ValidationRegex;
import org.eclipse.kapua.service.device.registry.DeviceAttributes;
import org.eclipse.kapua.service.device.registry.DeviceCreator;
import org.eclipse.kapua.service.device.registry.DeviceQuery;
import org.eclipse.kapua.service.device.registry.connection.DeviceConnectionCreator;

import java.util.regex.Pattern;

public enum DeviceValidationRegex implements ValidationRegex {

QUERY_FETCH_ATTRIBUTES("(" + DeviceAttributes.CONNECTION + "|" + DeviceAttributes.LAST_EVENT + ")");
/**
* Validates value of {@link DeviceQuery#getFetchAttributes()}.
*
* @since 1.0.0
*/
QUERY_FETCH_ATTRIBUTES("(" + DeviceAttributes.CONNECTION + "|" + DeviceAttributes.LAST_EVENT + ")"),

/**
* Validates value of {@link DeviceConnectionCreator#getClientId()} and {@link DeviceCreator#getClientId()}
*
* @since 1.2.0
*/
CLIENT_ID("^((?!#|\\+|\\*|&|,|\\?|>|\\/|\\:\\:).)*$");

private Pattern pattern;

Expand Down
Expand Up @@ -11,6 +11,7 @@
*******************************************************************************/
package org.eclipse.kapua.service.device.registry.connection.internal;

import org.eclipse.kapua.KapuaDuplicateNameException;
import org.eclipse.kapua.KapuaEntityNotFoundException;
import org.eclipse.kapua.KapuaException;
import org.eclipse.kapua.commons.configuration.AbstractKapuaConfigurableService;
Expand All @@ -24,6 +25,7 @@
import org.eclipse.kapua.service.authorization.AuthorizationService;
import org.eclipse.kapua.service.authorization.permission.PermissionFactory;
import org.eclipse.kapua.service.device.registry.DeviceDomains;
import org.eclipse.kapua.service.device.registry.common.DeviceValidationRegex;
import org.eclipse.kapua.service.device.registry.connection.DeviceConnection;
import org.eclipse.kapua.service.device.registry.connection.DeviceConnectionAttributes;
import org.eclipse.kapua.service.device.registry.connection.DeviceConnectionCreator;
Expand Down Expand Up @@ -54,7 +56,6 @@ public DeviceConnectionServiceImpl() {
}

public DeviceConnectionServiceImpl(DeviceEntityManagerFactory deviceEntityManagerFactory) {
// super(DeviceConnectionService.class.getName(), DEVICE_CONNECTION_DOMAIN, deviceEntityManagerFactory, DeviceConnectionService.class, DeviceConnectionFactory.class);
super(DeviceConnectionService.class.getName(), DeviceDomains.DEVICE_CONNECTION_DOMAIN, deviceEntityManagerFactory);
}

Expand All @@ -65,8 +66,10 @@ public DeviceConnection create(DeviceConnectionCreator deviceConnectionCreator)
// Argument Validation
ArgumentValidator.notNull(deviceConnectionCreator, "deviceConnectionCreator");
ArgumentValidator.notNull(deviceConnectionCreator.getScopeId(), "deviceConnectionCreator.scopeId");
ArgumentValidator.notEmptyOrNull(deviceConnectionCreator.getClientId(), "deviceConnectionCreator.clientId");
ArgumentValidator.notNull(deviceConnectionCreator.getUserId(), "deviceConnectionCreator.userId");
ArgumentValidator.notEmptyOrNull(deviceConnectionCreator.getClientId(), "deviceConnectionCreator.clientId");
ArgumentValidator.lengthRange(deviceConnectionCreator.getClientId(), 1, 255, "deviceCreator.clientId");
ArgumentValidator.match(deviceConnectionCreator.getClientId(), DeviceValidationRegex.CLIENT_ID, "deviceCreator.clientId");

//
// Check Access
Expand All @@ -75,6 +78,17 @@ public DeviceConnection create(DeviceConnectionCreator deviceConnectionCreator)
PermissionFactory permissionFactory = locator.getFactory(PermissionFactory.class);
authorizationService.checkPermission(permissionFactory.newPermission(DeviceDomains.DEVICE_CONNECTION_DOMAIN, Actions.write, null));

//
// Check duplicate clientId
DeviceConnectionQuery query = new DeviceConnectionQueryImpl(deviceConnectionCreator.getScopeId());
query.setPredicate(query.attributePredicate(DeviceConnectionAttributes.CLIENT_ID, deviceConnectionCreator.getClientId()));

if (count(query) > 0) {
throw new KapuaDuplicateNameException(deviceConnectionCreator.getClientId());
}

//
// Do create
return entityManagerSession.onTransactedInsert(em -> DeviceConnectionDAO.create(em, deviceConnectionCreator));
}

Expand Down
Expand Up @@ -22,7 +22,6 @@
import org.eclipse.kapua.locator.KapuaProvider;
import org.eclipse.kapua.model.id.KapuaId;
import org.eclipse.kapua.model.query.KapuaQuery;
import org.eclipse.kapua.model.query.predicate.QueryPredicate;
import org.eclipse.kapua.service.device.registry.Device;
import org.eclipse.kapua.service.device.registry.DeviceAttributes;
import org.eclipse.kapua.service.device.registry.DeviceCreator;
Expand Down Expand Up @@ -66,17 +65,22 @@ public DeviceRegistryServiceImpl() {
@Override
public Device create(DeviceCreator deviceCreator) throws KapuaException {
DeviceValidation.validateCreatePreconditions(deviceCreator);

//
// Check limits
if (allowedChildEntities(deviceCreator.getScopeId()) <= 0) {
throw new KapuaMaxNumberOfItemsReachedException("Devices");
}

//
// Check duplicate clientId
DeviceQuery query = new DeviceQueryImpl(deviceCreator.getScopeId());
query.setPredicate(query.attributePredicate(DeviceAttributes.CLIENT_ID, deviceCreator.getClientId()));
DeviceListResult deviceListResult = query(query);

if (!deviceListResult.isEmpty()) {
if (count(query) > 0) {
throw new KapuaDuplicateNameException(deviceCreator.getClientId());
}

return entityManagerSession.onTransactedInsert(entityManager -> DeviceDAO.create(entityManager, deviceCreator));
}

Expand All @@ -97,24 +101,28 @@ public Device update(Device device) throws KapuaException {
@Override
public Device find(KapuaId scopeId, KapuaId entityId) throws KapuaException {
DeviceValidation.validateFindPreconditions(scopeId, entityId);

return entityManagerSession.onResult(entityManager -> DeviceDAO.find(entityManager, scopeId, entityId));
}

@Override
public DeviceListResult query(KapuaQuery<Device> query) throws KapuaException {
DeviceValidation.validateQueryPreconditions(query);

return entityManagerSession.onResult(entityManager -> DeviceDAO.query(entityManager, query));
}

@Override
public long count(KapuaQuery<Device> query) throws KapuaException {
DeviceValidation.validateCountPreconditions(query);

return entityManagerSession.onResult(entityManager -> DeviceDAO.count(entityManager, query));
}

@Override
public void delete(KapuaId scopeId, KapuaId deviceId) throws KapuaException {
DeviceValidation.validateDeletePreconditions(scopeId, deviceId);

entityManagerSession.onTransactedAction(entityManager -> DeviceDAO.delete(entityManager, scopeId, deviceId));
}

Expand All @@ -123,9 +131,8 @@ public Device findByClientId(KapuaId scopeId, String clientId) throws KapuaExcep
DeviceValidation.validateFindByClientIdPreconditions(scopeId, clientId);

DeviceQueryImpl query = new DeviceQueryImpl(scopeId);
QueryPredicate predicate = query.attributePredicate(DeviceAttributes.CLIENT_ID, clientId);
query.setPredicate(query.attributePredicate(DeviceAttributes.CLIENT_ID, clientId));
query.setFetchAttributes(Lists.newArrayList(DeviceAttributes.CONNECTION, DeviceAttributes.LAST_EVENT));
query.setPredicate(predicate);

//
// Query and parse result
Expand Down

0 comments on commit 7f70b67

Please sign in to comment.