aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--schema/changelog-3.16.xml16
-rw-r--r--schema/changelog-master.xml1
-rw-r--r--src/org/traccar/BaseProtocolDecoder.java36
-rw-r--r--src/org/traccar/api/resource/DeviceResource.java6
-rw-r--r--src/org/traccar/database/DeviceManager.java26
-rw-r--r--src/org/traccar/database/PermissionsManager.java23
-rw-r--r--src/org/traccar/model/Device.java10
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..85ee11c40 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 = Context.getIdentityManager().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;
+ }
+
}