1 package org
.asamk
.signal
.dbus
;
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
;
16 import java
.io
.IOException
;
18 import java
.nio
.channels
.OverlappingFileLockException
;
19 import java
.util
.List
;
20 import java
.util
.concurrent
.TimeoutException
;
22 public class DbusSignalControlImpl
implements org
.asamk
.SignalControl
{
24 private final MultiAccountManager c
;
26 private final String objectPath
;
28 public DbusSignalControlImpl(final MultiAccountManager c
, final String objectPath
) {
30 this.objectPath
= objectPath
;
34 public boolean isRemote() {
39 public String
getObjectPath() {
45 final String number
, final boolean voiceVerification
46 ) throws Error
.Failure
, Error
.InvalidNumber
{
47 registerWithCaptcha(number
, voiceVerification
, null);
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.");
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());
71 public void verify(final String number
, final String verificationCode
) throws Error
.Failure
, Error
.InvalidNumber
{
72 verifyWithPin(number
, verificationCode
, null);
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());
89 public String
link(final String newDeviceName
) throws Error
.Failure
{
91 final ProvisioningManager provisioningManager
= c
.getNewProvisioningManager();
92 final URI deviceLinkUri
= provisioningManager
.getDeviceLinkUri();
95 provisioningManager
.finishDeviceLink(newDeviceName
);
96 } catch (IOException
| TimeoutException
| UserAlreadyExists e
) {
100 return deviceLinkUri
.toString();
101 } catch (TimeoutException
| IOException e
) {
102 throw new SignalControl
.Error
.Failure(e
.getClass().getSimpleName() + " " + e
.getMessage());
107 public String
version() {
108 return BaseConfig
.PROJECT_VERSION
;
112 public List
<DBusPath
> listAccounts() {
113 return c
.getAccountNumbers().stream().map(u
-> new DBusPath(DbusConfig
.getObjectPath(u
))).toList();