diff options
author | Anton Tananaev <anton@traccar.org> | 2023-11-25 14:19:23 -0800 |
---|---|---|
committer | Anton Tananaev <anton@traccar.org> | 2023-11-25 14:19:23 -0800 |
commit | a59a6d19f575d8b593085ce19458c8fff18a6360 (patch) | |
tree | 8610e2db4421ead592a40b6762aeba4aca66e034 /src/main/java/org/traccar/api/resource | |
parent | 25c5e09b02ae9e498562f3fe9a80bd6d7463a11b (diff) | |
download | trackermap-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/resource')
-rw-r--r-- | src/main/java/org/traccar/api/resource/DeviceResource.java | 37 |
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); + } + } |