From a59a6d19f575d8b593085ce19458c8fff18a6360 Mon Sep 17 00:00:00 2001 From: Anton Tananaev Date: Sat, 25 Nov 2023 14:19:23 -0800 Subject: Add device sharing (fix #3789, fix #4936, fix #5025) --- .../org/traccar/api/resource/DeviceResource.java | 37 ++++++++++++++++++++++ 1 file changed, 37 insertions(+) (limited to 'src/main/java/org/traccar/api/resource/DeviceResource.java') 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 { @Inject private MediaManager mediaManager; + @Inject + private TokenManager tokenManager; + public DeviceResource() { super(Device.class); } @@ -183,4 +191,33 @@ public class DeviceResource extends BaseObjectResource { 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); + } + } -- cgit v1.2.3