aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/traccar/api
diff options
context:
space:
mode:
authorAnton Tananaev <anton@traccar.org>2023-11-25 14:19:23 -0800
committerAnton Tananaev <anton@traccar.org>2023-11-25 14:19:23 -0800
commita59a6d19f575d8b593085ce19458c8fff18a6360 (patch)
tree8610e2db4421ead592a40b6762aeba4aca66e034 /src/main/java/org/traccar/api
parent25c5e09b02ae9e498562f3fe9a80bd6d7463a11b (diff)
downloadtrackermap-server-a59a6d19f575d8b593085ce19458c8fff18a6360.tar.gz
trackermap-server-a59a6d19f575d8b593085ce19458c8fff18a6360.tar.bz2
trackermap-server-a59a6d19f575d8b593085ce19458c8fff18a6360.zip
Add device sharing (fix #3789, fix #4936, fix #5025)
Diffstat (limited to 'src/main/java/org/traccar/api')
-rw-r--r--src/main/java/org/traccar/api/resource/DeviceResource.java37
1 files changed, 37 insertions, 0 deletions
diff --git a/src/main/java/org/traccar/api/resource/DeviceResource.java b/src/main/java/org/traccar/api/resource/DeviceResource.java
index 61a70bac0..ebc40a9b1 100644
--- a/src/main/java/org/traccar/api/resource/DeviceResource.java
+++ b/src/main/java/org/traccar/api/resource/DeviceResource.java
@@ -15,12 +15,15 @@
*/
package org.traccar.api.resource;
+import jakarta.ws.rs.FormParam;
import org.traccar.api.BaseObjectResource;
+import org.traccar.api.signature.TokenManager;
import org.traccar.broadcast.BroadcastService;
import org.traccar.database.MediaManager;
import org.traccar.helper.LogAction;
import org.traccar.model.Device;
import org.traccar.model.DeviceAccumulators;
+import org.traccar.model.Permission;
import org.traccar.model.Position;
import org.traccar.model.User;
import org.traccar.session.ConnectionManager;
@@ -46,7 +49,9 @@ import jakarta.ws.rs.core.Response;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
+import java.security.GeneralSecurityException;
import java.util.Collection;
+import java.util.Date;
import java.util.LinkedList;
import java.util.List;
@@ -67,6 +72,9 @@ public class DeviceResource extends BaseObjectResource<Device> {
@Inject
private MediaManager mediaManager;
+ @Inject
+ private TokenManager tokenManager;
+
public DeviceResource() {
super(Device.class);
}
@@ -183,4 +191,33 @@ public class DeviceResource extends BaseObjectResource<Device> {
return Response.status(Response.Status.NOT_FOUND).build();
}
+ @Path("share")
+ @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
+ @POST
+ public String shareDevice(
+ @FormParam("deviceId") long deviceId,
+ @FormParam("expiration") Date expiration) throws StorageException, GeneralSecurityException, IOException {
+
+ User user = permissionsService.getUser(getUserId());
+
+ Device device = storage.getObject(Device.class, new Request(
+ new Columns.All(),
+ new Condition.And(
+ new Condition.Equals("id", deviceId),
+ new Condition.Permission(User.class, user.getId(), Device.class))));
+
+ User share = new User();
+ share.setName(device.getName());
+ share.setEmail(user.getEmail() + ":" + device.getUniqueId());
+ share.setExpirationTime(expiration);
+ share.setTemporary(true);
+ share.setReadonly(true);
+
+ share.setId(storage.addObject(share, new Request(new Columns.Exclude("id"))));
+
+ storage.addPermission(new Permission(User.class, share.getId(), Device.class, deviceId));
+
+ return tokenManager.generateToken(share.getId(), expiration);
+ }
+
}