import org.asamk.signal.BaseConfig;
import org.asamk.signal.manager.Manager;
import org.asamk.signal.manager.api.AttachmentInvalidException;
+import org.asamk.signal.manager.api.CaptchaRejectedException;
+import org.asamk.signal.manager.api.DeviceLimitExceededException;
import org.asamk.signal.manager.api.DeviceLinkUrl;
import org.asamk.signal.manager.api.GroupId;
import org.asamk.signal.manager.api.GroupInviteLinkUrl;
private static final Logger logger = LoggerFactory.getLogger(DbusSignalImpl.class);
public DbusSignalImpl(
- final Manager m, DBusConnection connection, final String objectPath, final boolean noReceiveOnStart
+ final Manager m,
+ DBusConnection connection,
+ final String objectPath,
+ final boolean noReceiveOnStart
) {
this.m = m;
this.connection = connection;
m.submitRateLimitRecaptchaChallenge(challenge, captcha);
} catch (IOException e) {
throw new Error.Failure("Submit challenge error: " + e.getMessage());
+ } catch (CaptchaRejectedException e) {
+ throw new Error.Failure(
+ "Captcha rejected, it may be outdated, already used or solved from a different IP address.");
}
-
}
@Override
try {
var deviceLinkUrl = DeviceLinkUrl.parseDeviceLinkUri(new URI(uri));
m.addDeviceLink(deviceLinkUrl);
- } catch (IOException | InvalidDeviceLinkException e) {
+ } catch (IOException | InvalidDeviceLinkException | DeviceLimitExceededException e) {
throw new Error.Failure(e.getClass().getSimpleName() + " Add device link failed. " + e.getMessage());
} catch (NotPrimaryDeviceException e) {
throw new Error.Failure("This command doesn't work on linked devices.");
}
@Override
- public long sendMessage(final String message, final List<String> attachments, final List<String> recipients) {
+ public long sendMessage(final String messageText, final List<String> attachments, final List<String> recipients) {
try {
- final var results = m.sendMessage(new Message(message,
- attachments,
- List.of(),
- Optional.empty(),
- Optional.empty(),
- List.of(),
- Optional.empty(),
- List.of()),
- getSingleRecipientIdentifiers(recipients, m.getSelfNumber()).stream()
- .map(RecipientIdentifier.class::cast)
- .collect(Collectors.toSet()));
+ final var message = new Message(messageText,
+ attachments,
+ List.of(),
+ Optional.empty(),
+ Optional.empty(),
+ List.of(),
+ Optional.empty(),
+ List.of());
+ final var recipientIdentifiers = getSingleRecipientIdentifiers(recipients, m.getSelfNumber()).stream()
+ .map(RecipientIdentifier.class::cast)
+ .collect(Collectors.toSet());
+ final var results = m.sendMessage(message, recipientIdentifiers, false);
checkSendMessageResults(results);
return results.timestamp();
}
@Override
- public long sendRemoteDeleteMessage(
- final long targetSentTimestamp, final String recipient
- ) {
+ public long sendRemoteDeleteMessage(final long targetSentTimestamp, final String recipient) {
return sendRemoteDeleteMessage(targetSentTimestamp, List.of(recipient));
}
@Override
- public long sendRemoteDeleteMessage(
- final long targetSentTimestamp, final List<String> recipients
- ) {
+ public long sendRemoteDeleteMessage(final long targetSentTimestamp, final List<String> recipients) {
try {
final var results = m.sendRemoteDeleteMessage(targetSentTimestamp,
getSingleRecipientIdentifiers(recipients, m.getSelfNumber()).stream()
@Override
public long sendPaymentNotification(
- final byte[] receipt, final String note, final String recipient
+ final byte[] receipt,
+ final String note,
+ final String recipient
) throws Error.Failure {
try {
final var results = m.sendPaymentNotificationMessage(receipt,
@Override
public void sendTyping(
- final String recipient, final boolean stop
+ final String recipient,
+ final boolean stop
) throws Error.Failure, Error.GroupNotFound, Error.UntrustedIdentity {
try {
final var results = m.sendTypingMessage(stop ? TypingAction.STOP : TypingAction.START,
@Override
public void sendReadReceipt(
- final String recipient, final List<Long> messageIds
+ final String recipient,
+ final List<Long> messageIds
) throws Error.Failure, Error.UntrustedIdentity {
final var results = m.sendReadReceipt(getSingleRecipientIdentifier(recipient, m.getSelfNumber()), messageIds);
checkSendMessageResults(results);
@Override
public void sendViewedReceipt(
- final String recipient, final List<Long> messageIds
+ final String recipient,
+ final List<Long> messageIds
) throws Error.Failure, Error.UntrustedIdentity {
final var results = m.sendViewedReceipt(getSingleRecipientIdentifier(recipient, m.getSelfNumber()), messageIds);
checkSendMessageResults(results);
@Override
public long sendNoteToSelfMessage(
- final String message, final List<String> attachments
+ final String messageText,
+ final List<String> attachments
) throws Error.AttachmentInvalid, Error.Failure, Error.UntrustedIdentity {
try {
- final var results = m.sendMessage(new Message(message,
+ final var message = new Message(messageText,
attachments,
List.of(),
Optional.empty(),
Optional.empty(),
List.of(),
Optional.empty(),
- List.of()), Set.of(RecipientIdentifier.NoteToSelf.INSTANCE));
+ List.of());
+ final var results = m.sendMessage(message, Set.of(RecipientIdentifier.NoteToSelf.INSTANCE), false);
checkSendMessageResults(results);
return results.timestamp();
} catch (AttachmentInvalidException e) {
}
@Override
- public long sendGroupMessage(final String message, final List<String> attachments, final byte[] groupId) {
+ public long sendGroupMessage(final String messageText, final List<String> attachments, final byte[] groupId) {
try {
- var results = m.sendMessage(new Message(message,
+ final var message = new Message(messageText,
attachments,
List.of(),
Optional.empty(),
Optional.empty(),
List.of(),
Optional.empty(),
- List.of()), Set.of(getGroupRecipientIdentifier(groupId)));
+ List.of());
+ var results = m.sendMessage(message, Set.of(getGroupRecipientIdentifier(groupId)), false);
checkSendMessageResults(results);
return results.timestamp();
} catch (IOException | InvalidStickerException e) {
@Override
public void sendGroupTyping(
- final byte[] groupId, final boolean stop
+ final byte[] groupId,
+ final boolean stop
) throws Error.Failure, Error.GroupNotFound, Error.UntrustedIdentity {
try {
final var results = m.sendTypingMessage(stop ? TypingAction.STOP : TypingAction.START,
}
@Override
- public long sendGroupRemoteDeleteMessage(
- final long targetSentTimestamp, final byte[] groupId
- ) {
+ public long sendGroupRemoteDeleteMessage(final long targetSentTimestamp, final byte[] groupId) {
try {
final var results = m.sendRemoteDeleteMessage(targetSentTimestamp,
Set.of(getGroupRecipientIdentifier(groupId)));
@Override
public byte[] createGroup(
- final String name, final List<String> members, final String avatar
+ final String name,
+ final List<String> members,
+ final String avatar
) throws Error.AttachmentInvalid, Error.Failure, Error.InvalidNumber {
return updateGroupInternal(new byte[0], name, members, avatar);
}
@Override
public boolean isRegistered(String number) {
var result = isRegistered(List.of(number));
- return result.get(0);
+ return result.getFirst();
}
@Override
}
private static void checkGroupSendMessageResults(
- long timestamp, Collection<SendMessageResult> results
+ long timestamp,
+ Collection<SendMessageResult> results
) throws DBusExecutionException {
if (results.size() == 1) {
checkSendMessageResult(timestamp, results.stream().findFirst().get());
}
private static Set<RecipientIdentifier.Single> getSingleRecipientIdentifiers(
- final Collection<String> recipientStrings, final String localNumber
+ final Collection<String> recipientStrings,
+ final String localNumber
) throws DBusExecutionException {
final var identifiers = new HashSet<RecipientIdentifier.Single>();
for (var recipientString : recipientStrings) {
}
private static RecipientIdentifier.Single getSingleRecipientIdentifier(
- final String recipientString, final String localNumber
+ final String recipientString,
+ final String localNumber
) throws DBusExecutionException {
try {
return RecipientIdentifier.Single.fromString(recipientString, localNumber);
List.of(new DbusProperty<>("Number", () -> identity.recipient().number().orElse("")),
new DbusProperty<>("Uuid",
() -> identity.recipient().uuid().map(UUID::toString).orElse("")),
- new DbusProperty<>("Fingerprint", identity::getFingerprint),
+ new DbusProperty<>("Fingerprint", identity::fingerprint),
new DbusProperty<>("SafetyNumber", identity::safetyNumber),
new DbusProperty<>("ScannableSafetyNumber", identity::scannableSafetyNumber),
new DbusProperty<>("TrustLevel", identity::trustLevel),
try {
m.removeLinkedDevices(device.id());
updateDevices();
+ } catch (NotPrimaryDeviceException e) {
+ throw new Error.Failure("This command doesn't work on linked devices.");
} catch (IOException e) {
throw new Error.Failure(e.getMessage());
}
throw new Error.Failure("Only the name of this device can be changed");
}
try {
- m.updateAccountAttributes(name);
+ m.updateAccountAttributes(name, null, null, null);
// update device list
updateDevices();
} catch (IOException e) {