]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/FinishLinkCommand.java
Update libsignal-service-java
[signal-cli] / src / main / java / org / asamk / signal / commands / FinishLinkCommand.java
1 package org.asamk.signal.commands;
2
3 import com.fasterxml.jackson.core.type.TypeReference;
4
5 import org.asamk.signal.commands.exceptions.CommandException;
6 import org.asamk.signal.commands.exceptions.IOErrorException;
7 import org.asamk.signal.commands.exceptions.UserErrorException;
8 import org.asamk.signal.manager.MultiAccountManager;
9 import org.asamk.signal.manager.api.UserAlreadyExistsException;
10 import org.asamk.signal.output.JsonWriter;
11 import org.slf4j.Logger;
12 import org.slf4j.LoggerFactory;
13
14 import java.io.IOException;
15 import java.net.URI;
16 import java.net.URISyntaxException;
17 import java.util.concurrent.TimeoutException;
18
19 public class FinishLinkCommand implements JsonRpcMultiCommand<FinishLinkCommand.FinishLinkParams> {
20
21 private static final Logger logger = LoggerFactory.getLogger(FinishLinkCommand.class);
22
23 @Override
24 public String getName() {
25 return "finishLink";
26 }
27
28 @Override
29 public TypeReference<FinishLinkParams> getRequestType() {
30 return new TypeReference<>() {};
31 }
32
33 @Override
34 public void handleCommand(
35 final FinishLinkParams request,
36 final MultiAccountManager m,
37 final JsonWriter jsonWriter
38 ) throws CommandException {
39 if (request.deviceLinkUri() == null) {
40 throw new UserErrorException("Missing deviceLinkUri.");
41 }
42 final URI deviceLinkUri;
43 try {
44 deviceLinkUri = new URI(request.deviceLinkUri());
45 } catch (URISyntaxException e) {
46 throw new UserErrorException("Invalid device link uri.");
47 }
48 final var provisioningManager = m.getProvisioningManagerFor(deviceLinkUri);
49 if (provisioningManager == null) {
50 throw new UserErrorException("Unknown device link uri.");
51 }
52
53 var deviceName = request.deviceName();
54 if (deviceName == null) {
55 deviceName = "cli";
56 }
57 final String number;
58 try {
59 number = provisioningManager.finishDeviceLink(deviceName);
60 } catch (TimeoutException e) {
61 throw new UserErrorException("Link request timed out, please try again.");
62 } catch (IOException e) {
63 throw new IOErrorException("Link request error: "
64 + e.getMessage()
65 + " ("
66 + e.getClass().getSimpleName()
67 + ")", e);
68 } catch (UserAlreadyExistsException e) {
69 throw new UserErrorException("The user "
70 + e.getNumber()
71 + " already exists\nDelete \""
72 + e.getFileName()
73 + "\" before trying again.");
74 }
75
76 jsonWriter.write(new JsonFinishLink(number));
77 }
78
79 public record FinishLinkParams(String deviceLinkUri, String deviceName) {}
80
81 private record JsonFinishLink(String number) {}
82 }