diff options
-rw-r--r-- | schema/changelog-3.16.xml | 16 | ||||
-rw-r--r-- | schema/changelog-master.xml | 1 | ||||
-rw-r--r-- | src/org/traccar/BaseProtocolDecoder.java | 36 | ||||
-rw-r--r-- | src/org/traccar/api/resource/DeviceResource.java | 6 | ||||
-rw-r--r-- | src/org/traccar/database/DeviceManager.java | 26 | ||||
-rw-r--r-- | src/org/traccar/database/PermissionsManager.java | 23 | ||||
-rw-r--r-- | src/org/traccar/model/Device.java | 10 |
7 files changed, 96 insertions, 22 deletions
diff --git a/schema/changelog-3.16.xml b/schema/changelog-3.16.xml new file mode 100644 index 000000000..f95156133 --- /dev/null +++ b/schema/changelog-3.16.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<databaseChangeLog + xmlns="http://www.liquibase.org/xml/ns/dbchangelog" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog + http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.4.xsd" + logicalFilePath="changelog-3.16"> + + <changeSet author="author" id="changelog-3.16"> + + <addColumn tableName="devices"> + <column name="disabled" type="BOOLEAN" defaultValueBoolean="false" /> + </addColumn> + + </changeSet> +</databaseChangeLog> diff --git a/schema/changelog-master.xml b/schema/changelog-master.xml index 58b2a8307..0c6941eed 100644 --- a/schema/changelog-master.xml +++ b/schema/changelog-master.xml @@ -16,4 +16,5 @@ <include file="changelog-3.12.xml" relativeToChangelogFile="true" /> <include file="changelog-3.14.xml" relativeToChangelogFile="true" /> <include file="changelog-3.15.xml" relativeToChangelogFile="true" /> + <include file="changelog-3.16.xml" relativeToChangelogFile="true" /> </databaseChangeLog> diff --git a/src/org/traccar/BaseProtocolDecoder.java b/src/org/traccar/BaseProtocolDecoder.java index 2d6286bf8..e412134d1 100644 --- a/src/org/traccar/BaseProtocolDecoder.java +++ b/src/org/traccar/BaseProtocolDecoder.java @@ -85,12 +85,13 @@ public abstract class BaseProtocolDecoder extends ExtendedObjectDecoder { private Map<SocketAddress, DeviceSession> addressDeviceSessions = new HashMap<>(); // connectionless protocols private long findDeviceId(SocketAddress remoteAddress, String... uniqueIds) { - long deviceId = 0; if (uniqueIds.length > 0) { + long deviceId = 0; + Device device = null; try { for (String uniqueId : uniqueIds) { if (uniqueId != null) { - Device device = Context.getIdentityManager().getByUniqueId(uniqueId); + device = Context.getIdentityManager().getByUniqueId(uniqueId); if (device != null) { deviceId = device.getId(); break; @@ -100,22 +101,27 @@ public abstract class BaseProtocolDecoder extends ExtendedObjectDecoder { } catch (Exception e) { Log.warning(e); } + if (deviceId == 0 && Context.getConfig().getBoolean("database.registerUnknown")) { + return addUnknownDevice(uniqueIds[0]); + } + if (device != null && !device.getDisabled() || Context.getConfig().getBoolean("database.storeDisabled")) { + return deviceId; + } + StringBuilder message = new StringBuilder(); if (deviceId == 0) { - if (Context.getConfig().getBoolean("database.registerUnknown")) { - return addUnknownDevice(uniqueIds[0]); - } - - StringBuilder message = new StringBuilder("Unknown device -"); - for (String uniqueId : uniqueIds) { - message.append(" ").append(uniqueId); - } - if (remoteAddress != null) { - message.append(" (").append(((InetSocketAddress) remoteAddress).getHostString()).append(")"); - } - Log.warning(message.toString()); + message.append("Unknown device -"); + } else { + message.append("Disabled device -"); + } + for (String uniqueId : uniqueIds) { + message.append(" ").append(uniqueId); + } + if (remoteAddress != null) { + message.append(" (").append(((InetSocketAddress) remoteAddress).getHostString()).append(")"); } + Log.warning(message.toString()); } - return deviceId; + return 0; } public DeviceSession getDeviceSession(Channel channel, SocketAddress remoteAddress, String... uniqueIds) { diff --git a/src/org/traccar/api/resource/DeviceResource.java b/src/org/traccar/api/resource/DeviceResource.java index fda96a09d..0ea532567 100644 --- a/src/org/traccar/api/resource/DeviceResource.java +++ b/src/org/traccar/api/resource/DeviceResource.java @@ -65,7 +65,11 @@ public class DeviceResource extends BaseObjectResource<Device> { userId = getUserId(); } Context.getPermissionsManager().checkUser(getUserId(), userId); - result = deviceManager.getUserItems(userId); + if (Context.getPermissionsManager().getUserAdmin(getUserId())) { + result = deviceManager.getAllUserItems(userId); + } else { + result = deviceManager.getUserItems(userId); + } } else { result = new HashSet<Long>(); for (String uniqueId : uniqueIds) { diff --git a/src/org/traccar/database/DeviceManager.java b/src/org/traccar/database/DeviceManager.java index 1031c5da9..cb410b7c0 100644 --- a/src/org/traccar/database/DeviceManager.java +++ b/src/org/traccar/database/DeviceManager.java @@ -104,15 +104,35 @@ public class DeviceManager extends BaseObjectManager<Device> implements Identity return getItems(getAllItems()); } + public Set<Long> getAllUserItems(long userId) { + return Context.getPermissionsManager().getDevicePermissions(userId); + } + @Override public Set<Long> getUserItems(long userId) { if (Context.getPermissionsManager() != null) { - return Context.getPermissionsManager().getDevicePermissions(userId); + Set<Long> result = new HashSet<>(); + for (long deviceId : Context.getPermissionsManager().getDevicePermissions(userId)) { + Device device = getById(deviceId); + if (device != null && !device.getDisabled()) { + result.add(deviceId); + } + } + return result; } else { return new HashSet<>(); } } + public Set<Long> getAllManagedItems(long userId) { + Set<Long> result = new HashSet<>(); + result.addAll(getAllUserItems(userId)); + for (long managedUserId : Context.getUsersManager().getUserItems(userId)) { + result.addAll(getAllUserItems(managedUserId)); + } + return result; + } + @Override public Set<Long> getManagedItems(long userId) { Set<Long> result = new HashSet<>(); @@ -160,6 +180,7 @@ public class DeviceManager extends BaseObjectManager<Device> implements Identity cachedDevice.setCategory(device.getCategory()); cachedDevice.setContact(device.getContact()); cachedDevice.setModel(device.getModel()); + cachedDevice.setDisabled(device.getDisabled()); cachedDevice.setAttributes(device.getAttributes()); if (!device.getUniqueId().equals(cachedDevice.getUniqueId())) { devicesByUniqueId.remove(cachedDevice.getUniqueId()); @@ -246,7 +267,8 @@ public class DeviceManager extends BaseObjectManager<Device> implements Identity List<Position> result = new LinkedList<>(); if (Context.getPermissionsManager() != null) { - for (long deviceId : getUserItems(userId)) { + for (long deviceId : Context.getPermissionsManager().getUserAdmin(userId) + ? getAllUserItems(userId) : getUserItems(userId)) { if (positions.containsKey(deviceId)) { result.add(positions.get(deviceId)); } diff --git a/src/org/traccar/database/PermissionsManager.java b/src/org/traccar/database/PermissionsManager.java index 0e9097d25..60bda99ce 100644 --- a/src/org/traccar/database/PermissionsManager.java +++ b/src/org/traccar/database/PermissionsManager.java @@ -74,13 +74,28 @@ public class PermissionsManager { return devicePermissions.get(userId); } - public Set<Long> getDeviceUsers(long deviceId) { + private Set<Long> getAllDeviceUsers(long deviceId) { if (!deviceUsers.containsKey(deviceId)) { deviceUsers.put(deviceId, new HashSet<Long>()); } return deviceUsers.get(deviceId); } + public Set<Long> getDeviceUsers(long deviceId) { + Device device = Context.getIdentityManager().getById(deviceId); + if (device != null && !device.getDisabled()) { + return getAllDeviceUsers(deviceId); + } else { + Set<Long> result = new HashSet<>(); + for (long userId : getAllDeviceUsers(deviceId)) { + if (getUserAdmin(userId)) { + result.add(userId); + } + } + return result; + } + } + public Set<Long> getGroupDevices(long groupId) { if (!groupDevices.containsKey(groupId)) { groupDevices.put(groupId, new HashSet<Long>()); @@ -133,7 +148,7 @@ public class PermissionsManager { deviceUsers.clear(); for (Map.Entry<Long, Set<Long>> entry : devicePermissions.entrySet()) { for (long deviceId : entry.getValue()) { - getDeviceUsers(deviceId).add(entry.getKey()); + getAllDeviceUsers(deviceId).add(entry.getKey()); } } } @@ -179,9 +194,9 @@ public class PermissionsManager { if (deviceLimit != -1) { int deviceCount = 0; if (getUserManager(userId)) { - deviceCount = Context.getDeviceManager().getManagedItems(userId).size(); + deviceCount = Context.getDeviceManager().getAllManagedItems(userId).size(); } else { - deviceCount = Context.getDeviceManager().getUserItems(userId).size(); + deviceCount = Context.getDeviceManager().getAllUserItems(userId).size(); } if (deviceCount >= deviceLimit) { throw new SecurityException("User device limit reached"); diff --git a/src/org/traccar/model/Device.java b/src/org/traccar/model/Device.java index c8a28404c..51b479b09 100644 --- a/src/org/traccar/model/Device.java +++ b/src/org/traccar/model/Device.java @@ -149,4 +149,14 @@ public class Device extends ExtendedModel { this.category = category; } + private boolean disabled; + + public boolean getDisabled() { + return disabled; + } + + public void setDisabled(boolean disabled) { + this.disabled = disabled; + } + } |