]> nmode's Git Repositories - signal-cli/blob - src/main/java/org/asamk/signal/dbus/DbusSignalControlImpl.java
cfd17610d33c6d88ffd2c40b3d6ed695f9b7bcff
[signal-cli] / src / main / java / org / asamk / signal / dbus / DbusSignalControlImpl.java
1 package org.asamk.signal.dbus;
2
3 import org.asamk.SignalControl;
4 import org.asamk.signal.BaseConfig;
5 import org.asamk.signal.DbusConfig;
6 import org.asamk.signal.manager.Manager;
7 import org.asamk.signal.manager.MultiAccountManager;
8 import org.asamk.signal.manager.ProvisioningManager;
9 import org.asamk.signal.manager.RegistrationManager;
10 import org.asamk.signal.manager.UserAlreadyExists;
11 import org.asamk.signal.manager.api.CaptchaRequiredException;
12 import org.asamk.signal.manager.api.IncorrectPinException;
13 import org.asamk.signal.manager.api.PinLockedException;
14 import org.freedesktop.dbus.DBusPath;
15
16 import java.io.IOException;
17 import java.net.URI;
18 import java.nio.channels.OverlappingFileLockException;
19 import java.util.List;
20 import java.util.concurrent.TimeoutException;
21
22 public class DbusSignalControlImpl implements org.asamk.SignalControl {
23
24 private final MultiAccountManager c;
25
26 private final String objectPath;
27
28 public DbusSignalControlImpl(final MultiAccountManager c, final String objectPath) {
29 this.c = c;
30 this.objectPath = objectPath;
31 }
32
33 @Override
34 public boolean isRemote() {
35 return false;
36 }
37
38 @Override
39 public String getObjectPath() {
40 return objectPath;
41 }
42
43 @Override
44 public void register(
45 final String number, final boolean voiceVerification
46 ) throws Error.Failure, Error.InvalidNumber {
47 registerWithCaptcha(number, voiceVerification, null);
48 }
49
50 @Override
51 public void registerWithCaptcha(
52 final String number, final boolean voiceVerification, final String captcha
53 ) throws Error.Failure, Error.InvalidNumber {
54 if (!Manager.isValidNumber(number, null)) {
55 throw new SignalControl.Error.InvalidNumber(
56 "Invalid account (phone number), make sure you include the country code.");
57 }
58 try (final RegistrationManager registrationManager = c.getNewRegistrationManager(number)) {
59 registrationManager.register(voiceVerification, captcha);
60 } catch (CaptchaRequiredException e) {
61 String message = captcha == null ? "Captcha required for verification." : "Invalid captcha given.";
62 throw new SignalControl.Error.RequiresCaptcha(message);
63 } catch (OverlappingFileLockException e) {
64 throw new SignalControl.Error.Failure("Account is already in use");
65 } catch (IOException e) {
66 throw new SignalControl.Error.Failure(e.getClass().getSimpleName() + " " + e.getMessage());
67 }
68 }
69
70 @Override
71 public void verify(final String number, final String verificationCode) throws Error.Failure, Error.InvalidNumber {
72 verifyWithPin(number, verificationCode, null);
73 }
74
75 @Override
76 public void verifyWithPin(
77 final String number, final String verificationCode, final String pin
78 ) throws Error.Failure, Error.InvalidNumber {
79 try (final RegistrationManager registrationManager = c.getNewRegistrationManager(number)) {
80 registrationManager.verifyAccount(verificationCode, pin);
81 } catch (OverlappingFileLockException e) {
82 throw new SignalControl.Error.Failure("Account is already in use");
83 } catch (IOException | PinLockedException | IncorrectPinException e) {
84 throw new SignalControl.Error.Failure(e.getClass().getSimpleName() + " " + e.getMessage());
85 }
86 }
87
88 @Override
89 public String link(final String newDeviceName) throws Error.Failure {
90 try {
91 final ProvisioningManager provisioningManager = c.getNewProvisioningManager();
92 final URI deviceLinkUri = provisioningManager.getDeviceLinkUri();
93 new Thread(() -> {
94 try {
95 provisioningManager.finishDeviceLink(newDeviceName);
96 } catch (IOException | TimeoutException | UserAlreadyExists e) {
97 e.printStackTrace();
98 }
99 }).start();
100 return deviceLinkUri.toString();
101 } catch (TimeoutException | IOException e) {
102 throw new SignalControl.Error.Failure(e.getClass().getSimpleName() + " " + e.getMessage());
103 }
104 }
105
106 @Override
107 public String version() {
108 return BaseConfig.PROJECT_VERSION;
109 }
110
111 @Override
112 public List<DBusPath> listAccounts() {
113 return c.getAccountNumbers().stream().map(u -> new DBusPath(DbusConfig.getObjectPath(u))).toList();
114 }
115 }