]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/commands/FinishLinkCommand.java
Implement dbus support for listIdentities
[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, final MultiAccountManager m, final JsonWriter jsonWriter
36 ) throws CommandException {
37 if (request.deviceLinkUri() == null) {
38 throw new UserErrorException("Missing deviceLinkUri.");
39 }
40 final URI deviceLinkUri;
41 try {
42 deviceLinkUri = new URI(request.deviceLinkUri());
43 } catch (URISyntaxException e) {
44 throw new UserErrorException("Invalid device link uri.");
45 }
46 final var provisioningManager = m.getProvisioningManagerFor(deviceLinkUri);
47 if (provisioningManager == null) {
48 throw new UserErrorException("Unknown device link uri.");
49 }
50
51 var deviceName = request.deviceName();
52 if (deviceName == null) {
53 deviceName = "cli";
54 }
55 final String number;
56 try {
57 number = provisioningManager.finishDeviceLink(deviceName);
58 } catch (TimeoutException e) {
59 throw new UserErrorException("Link request timed out, please try again.");
60 } catch (IOException e) {
61 throw new IOErrorException("Link request error: "
62 + e.getMessage()
63 + " ("
64 + e.getClass().getSimpleName()
65 + ")", e);
66 } catch (UserAlreadyExistsException e) {
67 throw new UserErrorException("The user "
68 + e.getNumber()
69 + " already exists\nDelete \""
70 + e.getFileName()
71 + "\" before trying again.");
72 }
73
74 jsonWriter.write(new JsonFinishLink(number));
75 }
76
77 public record FinishLinkParams(String deviceLinkUri, String deviceName) {}
78
79 private record JsonFinishLink(String number) {}
80 }