mirror of
https://github.com/AsamK/signal-cli
synced 2025-08-29 10:30:38 +00:00
Use SignalServiceAddress in more places
This commit is contained in:
parent
8a44b37774
commit
e2b7bda65b
11 changed files with 124 additions and 114 deletions
|
@ -13,13 +13,13 @@ import java.util.List;
|
|||
|
||||
public interface Signal extends DBusInterface {
|
||||
|
||||
void sendMessage(String message, List<String> attachments, String recipient) throws EncapsulatedExceptions, AttachmentInvalidException, IOException;
|
||||
void sendMessage(String message, List<String> attachments, String recipient) throws EncapsulatedExceptions, AttachmentInvalidException, IOException, InvalidNumberException;
|
||||
|
||||
void sendMessage(String message, List<String> attachments, List<String> recipients) throws EncapsulatedExceptions, AttachmentInvalidException, IOException;
|
||||
void sendMessage(String message, List<String> attachments, List<String> recipients) throws EncapsulatedExceptions, AttachmentInvalidException, IOException, InvalidNumberException;
|
||||
|
||||
void sendEndSessionMessage(List<String> recipients) throws IOException, EncapsulatedExceptions;
|
||||
void sendEndSessionMessage(List<String> recipients) throws IOException, EncapsulatedExceptions, InvalidNumberException;
|
||||
|
||||
void sendGroupMessage(String message, List<String> attachments, byte[] groupId) throws EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException, IOException;
|
||||
void sendGroupMessage(String message, List<String> attachments, byte[] groupId) throws EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException, IOException, InvalidNumberException;
|
||||
|
||||
String getContactName(String number) throws InvalidNumberException;
|
||||
|
||||
|
@ -35,7 +35,7 @@ public interface Signal extends DBusInterface {
|
|||
|
||||
List<String> getGroupMembers(byte[] groupId);
|
||||
|
||||
byte[] updateGroup(byte[] groupId, String name, List<String> members, String avatar) throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException;
|
||||
byte[] updateGroup(byte[] groupId, String name, List<String> members, String avatar) throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException, InvalidNumberException;
|
||||
|
||||
boolean isRegistered();
|
||||
|
||||
|
|
|
@ -109,7 +109,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
|
|||
System.out.println("Received sync read messages list");
|
||||
for (ReadMessage rm : syncMessage.getRead().get()) {
|
||||
ContactInfo fromContact = m.getContact(rm.getSender().getNumber().get());
|
||||
System.out.println("From: " + (fromContact == null ? "" : "“" + fromContact.name + "” ") + rm.getSender().getNumber() + " Message timestamp: " + DateUtils.formatTimestamp(rm.getTimestamp()));
|
||||
System.out.println("From: " + (fromContact == null ? "" : "“" + fromContact.name + "” ") + rm.getSender().getNumber().get() + " Message timestamp: " + DateUtils.formatTimestamp(rm.getTimestamp()));
|
||||
}
|
||||
}
|
||||
if (syncMessage.getRequest().isPresent()) {
|
||||
|
@ -144,7 +144,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
|
|||
System.out.println("Blocked numbers:");
|
||||
final BlockedListMessage blockedList = syncMessage.getBlockedList().get();
|
||||
for (SignalServiceAddress address : blockedList.getAddresses()) {
|
||||
System.out.println(" - " + address.getNumber());
|
||||
System.out.println(" - " + address.getNumber().get());
|
||||
}
|
||||
}
|
||||
if (syncMessage.getVerified().isPresent()) {
|
||||
|
@ -168,7 +168,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
|
|||
if (syncMessage.getViewOnceOpen().isPresent()) {
|
||||
final ViewOnceOpenMessage viewOnceOpenMessage = syncMessage.getViewOnceOpen().get();
|
||||
System.out.println("Received sync message with view once open message:");
|
||||
System.out.println(" - Sender:" + viewOnceOpenMessage.getSender().getNumber());
|
||||
System.out.println(" - Sender:" + viewOnceOpenMessage.getSender().getNumber().get());
|
||||
System.out.println(" - Timestamp:" + viewOnceOpenMessage.getTimestamp());
|
||||
}
|
||||
if (syncMessage.getStickerPackOperations().isPresent()) {
|
||||
|
@ -322,7 +322,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
|
|||
final SignalServiceDataMessage.Reaction reaction = message.getReaction().get();
|
||||
System.out.println("Reaction:");
|
||||
System.out.println(" - Emoji: " + reaction.getEmoji());
|
||||
System.out.println(" - Target author: " + reaction.getTargetAuthor().getNumber());
|
||||
System.out.println(" - Target author: " + reaction.getTargetAuthor().getNumber().get());
|
||||
System.out.println(" - Target timestamp: " + reaction.getTargetSentTimestamp());
|
||||
System.out.println(" - Is remove: " + reaction.isRemove());
|
||||
}
|
||||
|
@ -330,7 +330,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
|
|||
if (message.getQuote().isPresent()) {
|
||||
SignalServiceDataMessage.Quote quote = message.getQuote().get();
|
||||
System.out.println("Quote: (" + quote.getId() + ")");
|
||||
System.out.println(" Author: " + quote.getAuthor().getNumber());
|
||||
System.out.println(" Author: " + quote.getAuthor().getNumber().get());
|
||||
System.out.println(" Text: " + quote.getText());
|
||||
if (quote.getAttachments().size() > 0) {
|
||||
System.out.println(" Attachments: ");
|
||||
|
|
|
@ -9,6 +9,7 @@ import org.asamk.signal.NotAGroupMemberException;
|
|||
import org.asamk.signal.manager.Manager;
|
||||
import org.asamk.signal.util.Util;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions;
|
||||
import org.whispersystems.signalservice.api.util.InvalidNumberException;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
|
@ -17,6 +18,7 @@ import static org.asamk.signal.util.ErrorUtils.handleEncapsulatedExceptions;
|
|||
import static org.asamk.signal.util.ErrorUtils.handleGroupIdFormatException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleGroupNotFoundException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleIOException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleInvalidNumberException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleNotAGroupMemberException;
|
||||
|
||||
public class QuitGroupCommand implements LocalCommand {
|
||||
|
@ -56,6 +58,9 @@ public class QuitGroupCommand implements LocalCommand {
|
|||
} catch (GroupIdFormatException e) {
|
||||
handleGroupIdFormatException(e);
|
||||
return 1;
|
||||
} catch (InvalidNumberException e) {
|
||||
handleInvalidNumberException(e);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -13,6 +13,7 @@ import org.asamk.signal.util.IOUtils;
|
|||
import org.asamk.signal.util.Util;
|
||||
import org.freedesktop.dbus.exceptions.DBusExecutionException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions;
|
||||
import org.whispersystems.signalservice.api.util.InvalidNumberException;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.nio.charset.Charset;
|
||||
|
@ -25,6 +26,7 @@ import static org.asamk.signal.util.ErrorUtils.handleEncapsulatedExceptions;
|
|||
import static org.asamk.signal.util.ErrorUtils.handleGroupIdFormatException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleGroupNotFoundException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleIOException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleInvalidNumberException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleNotAGroupMemberException;
|
||||
|
||||
public class SendCommand implements DbusCommand {
|
||||
|
@ -75,6 +77,9 @@ public class SendCommand implements DbusCommand {
|
|||
} catch (DBusExecutionException e) {
|
||||
handleDBusExecutionException(e);
|
||||
return 1;
|
||||
} catch (InvalidNumberException e) {
|
||||
handleInvalidNumberException(e);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -126,6 +131,9 @@ public class SendCommand implements DbusCommand {
|
|||
} catch (GroupIdFormatException e) {
|
||||
handleGroupIdFormatException(e);
|
||||
return 1;
|
||||
} catch (InvalidNumberException e) {
|
||||
handleInvalidNumberException(e);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ import org.asamk.signal.manager.Manager;
|
|||
import org.asamk.signal.util.Util;
|
||||
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions;
|
||||
import org.whispersystems.signalservice.api.util.InvalidNumberException;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
|
@ -19,6 +20,7 @@ import static org.asamk.signal.util.ErrorUtils.handleEncapsulatedExceptions;
|
|||
import static org.asamk.signal.util.ErrorUtils.handleGroupIdFormatException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleGroupNotFoundException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleIOException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleInvalidNumberException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleNotAGroupMemberException;
|
||||
|
||||
public class SendReactionCommand implements LocalCommand {
|
||||
|
@ -90,6 +92,9 @@ public class SendReactionCommand implements LocalCommand {
|
|||
} catch (GroupIdFormatException e) {
|
||||
handleGroupIdFormatException(e);
|
||||
return 1;
|
||||
} catch (InvalidNumberException e) {
|
||||
handleInvalidNumberException(e);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ import org.asamk.signal.GroupNotFoundException;
|
|||
import org.asamk.signal.NotAGroupMemberException;
|
||||
import org.asamk.signal.util.Util;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions;
|
||||
import org.whispersystems.signalservice.api.util.InvalidNumberException;
|
||||
import org.whispersystems.util.Base64;
|
||||
|
||||
import java.io.IOException;
|
||||
|
@ -20,6 +21,7 @@ import static org.asamk.signal.util.ErrorUtils.handleEncapsulatedExceptions;
|
|||
import static org.asamk.signal.util.ErrorUtils.handleGroupIdFormatException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleGroupNotFoundException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleIOException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleInvalidNumberException;
|
||||
import static org.asamk.signal.util.ErrorUtils.handleNotAGroupMemberException;
|
||||
|
||||
public class UpdateGroupCommand implements DbusCommand {
|
||||
|
@ -88,6 +90,9 @@ public class UpdateGroupCommand implements DbusCommand {
|
|||
} catch (GroupIdFormatException e) {
|
||||
handleGroupIdFormatException(e);
|
||||
return 1;
|
||||
} catch (InvalidNumberException e) {
|
||||
handleInvalidNumberException(e);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -171,10 +171,6 @@ public class Manager implements Signal {
|
|||
return username;
|
||||
}
|
||||
|
||||
private SignalServiceAddress getSelfAddress() {
|
||||
return new SignalServiceAddress(null, username);
|
||||
}
|
||||
|
||||
private SignalServiceAccountManager getSignalServiceAccountManager() {
|
||||
return new SignalServiceAccountManager(BaseConfig.serviceConfiguration, null, account.getUsername(), account.getPassword(), account.getDeviceId(), BaseConfig.USER_AGENT, timer);
|
||||
}
|
||||
|
@ -453,11 +449,11 @@ public class Manager implements Signal {
|
|||
}
|
||||
|
||||
private SignalServiceMessageReceiver getMessageReceiver() {
|
||||
return new SignalServiceMessageReceiver(BaseConfig.serviceConfiguration, null, username, account.getPassword(), account.getDeviceId(), account.getSignalingKey(), BaseConfig.USER_AGENT, null, timer);
|
||||
return new SignalServiceMessageReceiver(BaseConfig.serviceConfiguration, account.getUuid(), account.getUsername(), account.getPassword(), account.getDeviceId(), account.getSignalingKey(), BaseConfig.USER_AGENT, null, timer);
|
||||
}
|
||||
|
||||
private SignalServiceMessageSender getMessageSender() {
|
||||
return new SignalServiceMessageSender(BaseConfig.serviceConfiguration, null, username, account.getPassword(),
|
||||
return new SignalServiceMessageSender(BaseConfig.serviceConfiguration, account.getUuid(), account.getUsername(), account.getPassword(),
|
||||
account.getDeviceId(), account.getSignalProtocolStore(), BaseConfig.USER_AGENT, account.isMultiDevice(), Optional.fromNullable(messagePipe), Optional.fromNullable(unidentifiedMessagePipe), Optional.absent());
|
||||
}
|
||||
|
||||
|
@ -504,7 +500,7 @@ public class Manager implements Signal {
|
|||
throw new GroupNotFoundException(groupId);
|
||||
}
|
||||
for (String member : g.members) {
|
||||
if (member.equals(this.username)) {
|
||||
if (member.equals(account.getUsername())) {
|
||||
return g;
|
||||
}
|
||||
}
|
||||
|
@ -518,7 +514,7 @@ public class Manager implements Signal {
|
|||
@Override
|
||||
public void sendGroupMessage(String messageText, List<String> attachments,
|
||||
byte[] groupId)
|
||||
throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException {
|
||||
throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException, InvalidNumberException {
|
||||
final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder().withBody(messageText);
|
||||
if (attachments != null) {
|
||||
messageBuilder.withAttachments(Utils.getSignalServiceAttachments(attachments));
|
||||
|
@ -536,15 +532,15 @@ public class Manager implements Signal {
|
|||
|
||||
final GroupInfo g = getGroupForSending(groupId);
|
||||
|
||||
final Collection<SignalServiceAddress> membersSend = getSignalServiceAddresses(g.members);
|
||||
// Don't send group message to ourself
|
||||
final List<String> membersSend = new ArrayList<>(g.members);
|
||||
membersSend.remove(this.username);
|
||||
membersSend.remove(account.getSelfAddress());
|
||||
sendMessageLegacy(messageBuilder, membersSend);
|
||||
}
|
||||
|
||||
public void sendGroupMessageReaction(String emoji, boolean remove, SignalServiceAddress targetAuthor,
|
||||
long targetSentTimestamp, byte[] groupId)
|
||||
throws IOException, EncapsulatedExceptions, AttachmentInvalidException {
|
||||
throws IOException, EncapsulatedExceptions, AttachmentInvalidException, InvalidNumberException {
|
||||
SignalServiceDataMessage.Reaction reaction = new SignalServiceDataMessage.Reaction(emoji, remove, targetAuthor, targetSentTimestamp);
|
||||
final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder()
|
||||
.withReaction(reaction)
|
||||
|
@ -556,13 +552,13 @@ public class Manager implements Signal {
|
|||
messageBuilder.asGroupMessage(group);
|
||||
}
|
||||
final GroupInfo g = getGroupForSending(groupId);
|
||||
final Collection<SignalServiceAddress> membersSend = getSignalServiceAddresses(g.members);
|
||||
// Don't send group message to ourself
|
||||
final List<String> membersSend = new ArrayList<>(g.members);
|
||||
membersSend.remove(this.username);
|
||||
membersSend.remove(account.getSelfAddress());
|
||||
sendMessageLegacy(messageBuilder, membersSend);
|
||||
}
|
||||
|
||||
public void sendQuitGroupMessage(byte[] groupId) throws GroupNotFoundException, IOException, EncapsulatedExceptions {
|
||||
public void sendQuitGroupMessage(byte[] groupId) throws GroupNotFoundException, IOException, EncapsulatedExceptions, InvalidNumberException {
|
||||
SignalServiceGroup group = SignalServiceGroup.newBuilder(SignalServiceGroup.Type.QUIT)
|
||||
.withId(groupId)
|
||||
.build();
|
||||
|
@ -571,18 +567,18 @@ public class Manager implements Signal {
|
|||
.asGroupMessage(group);
|
||||
|
||||
final GroupInfo g = getGroupForSending(groupId);
|
||||
g.members.remove(this.username);
|
||||
g.members.remove(account.getUsername());
|
||||
account.getGroupStore().updateGroup(g);
|
||||
|
||||
sendMessageLegacy(messageBuilder, g.members);
|
||||
sendMessageLegacy(messageBuilder, getSignalServiceAddresses(g.members));
|
||||
}
|
||||
|
||||
private byte[] sendUpdateGroupMessage(byte[] groupId, String name, Collection<String> members, String avatarFile) throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException {
|
||||
private byte[] sendUpdateGroupMessage(byte[] groupId, String name, Collection<String> members, String avatarFile) throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException, InvalidNumberException {
|
||||
GroupInfo g;
|
||||
if (groupId == null) {
|
||||
// Create new group
|
||||
g = new GroupInfo(KeyUtils.createGroupId());
|
||||
g.members.add(username);
|
||||
g.members.add(account.getUsername());
|
||||
} else {
|
||||
g = getGroupForSending(groupId);
|
||||
}
|
||||
|
@ -594,13 +590,7 @@ public class Manager implements Signal {
|
|||
if (members != null) {
|
||||
Set<String> newMembers = new HashSet<>();
|
||||
for (String member : members) {
|
||||
try {
|
||||
member = Utils.canonicalizeNumber(member, username);
|
||||
} catch (InvalidNumberException e) {
|
||||
System.err.println("Failed to add member \"" + member + "\" to group: " + e.getMessage());
|
||||
System.err.println("Aborting…");
|
||||
System.exit(1);
|
||||
}
|
||||
member = Utils.canonicalizeNumber(member, account.getUsername());
|
||||
if (g.members.contains(member)) {
|
||||
continue;
|
||||
}
|
||||
|
@ -629,29 +619,27 @@ public class Manager implements Signal {
|
|||
|
||||
SignalServiceDataMessage.Builder messageBuilder = getGroupUpdateMessageBuilder(g);
|
||||
|
||||
final Collection<SignalServiceAddress> membersSend = getSignalServiceAddresses(g.members);
|
||||
// Don't send group message to ourself
|
||||
final List<String> membersSend = new ArrayList<>(g.members);
|
||||
membersSend.remove(this.username);
|
||||
membersSend.remove(account.getSelfAddress());
|
||||
sendMessageLegacy(messageBuilder, membersSend);
|
||||
return g.groupId;
|
||||
}
|
||||
|
||||
private void sendUpdateGroupMessage(byte[] groupId, String recipient) throws IOException, EncapsulatedExceptions {
|
||||
private void sendUpdateGroupMessage(byte[] groupId, SignalServiceAddress recipient) throws IOException, EncapsulatedExceptions {
|
||||
if (groupId == null) {
|
||||
return;
|
||||
}
|
||||
GroupInfo g = getGroupForSending(groupId);
|
||||
|
||||
if (!g.members.contains(recipient)) {
|
||||
if (!g.members.contains(recipient.getNumber().get())) {
|
||||
return;
|
||||
}
|
||||
|
||||
SignalServiceDataMessage.Builder messageBuilder = getGroupUpdateMessageBuilder(g);
|
||||
|
||||
// Send group message only to the recipient who requested it
|
||||
final List<String> membersSend = new ArrayList<>();
|
||||
membersSend.add(recipient);
|
||||
sendMessageLegacy(messageBuilder, membersSend);
|
||||
sendMessageLegacy(messageBuilder, Collections.singleton(recipient));
|
||||
}
|
||||
|
||||
private SignalServiceDataMessage.Builder getGroupUpdateMessageBuilder(GroupInfo g) {
|
||||
|
@ -680,7 +668,7 @@ public class Manager implements Signal {
|
|||
return messageBuilder;
|
||||
}
|
||||
|
||||
private void sendGroupInfoRequest(byte[] groupId, String recipient) throws IOException, EncapsulatedExceptions {
|
||||
private void sendGroupInfoRequest(byte[] groupId, SignalServiceAddress recipient) throws IOException, EncapsulatedExceptions {
|
||||
if (groupId == null) {
|
||||
return;
|
||||
}
|
||||
|
@ -697,14 +685,12 @@ public class Manager implements Signal {
|
|||
}
|
||||
|
||||
// Send group info request message to the recipient who sent us a message with this groupId
|
||||
final List<String> membersSend = new ArrayList<>();
|
||||
membersSend.add(recipient);
|
||||
sendMessageLegacy(messageBuilder, membersSend);
|
||||
sendMessageLegacy(messageBuilder, Collections.singleton(recipient));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendMessage(String message, List<String> attachments, String recipient)
|
||||
throws EncapsulatedExceptions, AttachmentInvalidException, IOException {
|
||||
throws EncapsulatedExceptions, AttachmentInvalidException, IOException, InvalidNumberException {
|
||||
List<String> recipients = new ArrayList<>(1);
|
||||
recipients.add(recipient);
|
||||
sendMessage(message, attachments, recipients);
|
||||
|
@ -713,7 +699,7 @@ public class Manager implements Signal {
|
|||
@Override
|
||||
public void sendMessage(String messageText, List<String> attachments,
|
||||
List<String> recipients)
|
||||
throws IOException, EncapsulatedExceptions, AttachmentInvalidException {
|
||||
throws IOException, EncapsulatedExceptions, AttachmentInvalidException, InvalidNumberException {
|
||||
final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder().withBody(messageText);
|
||||
if (attachments != null) {
|
||||
List<SignalServiceAttachment> attachmentStreams = Utils.getSignalServiceAttachments(attachments);
|
||||
|
@ -732,30 +718,30 @@ public class Manager implements Signal {
|
|||
messageBuilder.withAttachments(attachmentPointers);
|
||||
}
|
||||
messageBuilder.withProfileKey(account.getProfileKey().serialize());
|
||||
sendMessageLegacy(messageBuilder, recipients);
|
||||
sendMessageLegacy(messageBuilder, getSignalServiceAddresses(recipients));
|
||||
}
|
||||
|
||||
public void sendMessageReaction(String emoji, boolean remove, SignalServiceAddress targetAuthor,
|
||||
long targetSentTimestamp, List<String> recipients)
|
||||
throws IOException, EncapsulatedExceptions, AttachmentInvalidException {
|
||||
throws IOException, EncapsulatedExceptions, AttachmentInvalidException, InvalidNumberException {
|
||||
SignalServiceDataMessage.Reaction reaction = new SignalServiceDataMessage.Reaction(emoji, remove, targetAuthor, targetSentTimestamp);
|
||||
final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder()
|
||||
.withReaction(reaction)
|
||||
.withProfileKey(account.getProfileKey().serialize());
|
||||
sendMessageLegacy(messageBuilder, recipients);
|
||||
sendMessageLegacy(messageBuilder, getSignalServiceAddresses(recipients));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void sendEndSessionMessage(List<String> recipients) throws IOException, EncapsulatedExceptions {
|
||||
public void sendEndSessionMessage(List<String> recipients) throws IOException, EncapsulatedExceptions, InvalidNumberException {
|
||||
SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder()
|
||||
.asEndSessionMessage();
|
||||
|
||||
sendMessageLegacy(messageBuilder, recipients);
|
||||
sendMessageLegacy(messageBuilder, getSignalServiceAddresses(recipients));
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getContactName(String number) throws InvalidNumberException {
|
||||
String canonicalizedNumber = Utils.canonicalizeNumber(number, username);
|
||||
String canonicalizedNumber = Utils.canonicalizeNumber(number, account.getUsername());
|
||||
ContactInfo contact = account.getContactStore().getContact(canonicalizedNumber);
|
||||
if (contact == null) {
|
||||
return "";
|
||||
|
@ -766,7 +752,7 @@ public class Manager implements Signal {
|
|||
|
||||
@Override
|
||||
public void setContactName(String number, String name) throws InvalidNumberException {
|
||||
String canonicalizedNumber = Utils.canonicalizeNumber(number, username);
|
||||
String canonicalizedNumber = Utils.canonicalizeNumber(number, account.getUsername());
|
||||
ContactInfo contact = account.getContactStore().getContact(canonicalizedNumber);
|
||||
if (contact == null) {
|
||||
contact = new ContactInfo();
|
||||
|
@ -782,7 +768,7 @@ public class Manager implements Signal {
|
|||
|
||||
@Override
|
||||
public void setContactBlocked(String number, boolean blocked) throws InvalidNumberException {
|
||||
number = Utils.canonicalizeNumber(number, username);
|
||||
number = Utils.canonicalizeNumber(number, account.getUsername());
|
||||
ContactInfo contact = account.getContactStore().getContact(number);
|
||||
if (contact == null) {
|
||||
contact = new ContactInfo();
|
||||
|
@ -840,7 +826,7 @@ public class Manager implements Signal {
|
|||
}
|
||||
|
||||
@Override
|
||||
public byte[] updateGroup(byte[] groupId, String name, List<String> members, String avatar) throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException {
|
||||
public byte[] updateGroup(byte[] groupId, String name, List<String> members, String avatar) throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException, InvalidNumberException {
|
||||
if (groupId.length == 0) {
|
||||
groupId = null;
|
||||
}
|
||||
|
@ -858,9 +844,6 @@ public class Manager implements Signal {
|
|||
|
||||
/**
|
||||
* Change the expiration timer for a thread (number of groupId)
|
||||
*
|
||||
* @param numberOrGroupId
|
||||
* @param messageExpirationTimer
|
||||
*/
|
||||
public void setExpirationTimer(String numberOrGroupId, int messageExpirationTimer) {
|
||||
ThreadInfo thread = account.getThreadStore().getThread(numberOrGroupId);
|
||||
|
@ -953,7 +936,7 @@ public class Manager implements Signal {
|
|||
stickers);
|
||||
}
|
||||
|
||||
private static JsonStickerPack parseStickerPack(String rootPath, ZipFile zip) throws IOException, StickerPackInvalidException {
|
||||
private static JsonStickerPack parseStickerPack(String rootPath, ZipFile zip) throws IOException {
|
||||
InputStream inputStream;
|
||||
if (zip != null) {
|
||||
inputStream = zip.getInputStream(zip.getEntry("manifest.json"));
|
||||
|
@ -1121,7 +1104,7 @@ public class Manager implements Signal {
|
|||
/**
|
||||
* This method throws an EncapsulatedExceptions exception instead of returning a list of SendMessageResult.
|
||||
*/
|
||||
private void sendMessageLegacy(SignalServiceDataMessage.Builder messageBuilder, Collection<String> recipients)
|
||||
private void sendMessageLegacy(SignalServiceDataMessage.Builder messageBuilder, Collection<SignalServiceAddress> recipients)
|
||||
throws EncapsulatedExceptions, IOException {
|
||||
List<SendMessageResult> results = sendMessage(messageBuilder, recipients);
|
||||
|
||||
|
@ -1143,14 +1126,24 @@ public class Manager implements Signal {
|
|||
}
|
||||
}
|
||||
|
||||
private List<SendMessageResult> sendMessage(SignalServiceDataMessage.Builder messageBuilder, Collection<String> recipients)
|
||||
throws IOException {
|
||||
Set<SignalServiceAddress> recipientsTS = Utils.getSignalServiceAddresses(recipients, username);
|
||||
if (recipientsTS == null) {
|
||||
account.save();
|
||||
return Collections.emptyList();
|
||||
}
|
||||
private Collection<SignalServiceAddress> getSignalServiceAddresses(Collection<String> numbers) throws InvalidNumberException {
|
||||
final Set<SignalServiceAddress> signalServiceAddresses = new HashSet<>(numbers.size());
|
||||
final String username = account.getUsername();
|
||||
|
||||
for (String number : numbers) {
|
||||
String canonicalizedNumber = Utils.canonicalizeNumber(number, username);
|
||||
if (canonicalizedNumber.equals(username)) {
|
||||
signalServiceAddresses.add(account.getSelfAddress());
|
||||
} else {
|
||||
// TODO get corresponding uuid
|
||||
signalServiceAddresses.add(new SignalServiceAddress(null, canonicalizedNumber));
|
||||
}
|
||||
}
|
||||
return signalServiceAddresses;
|
||||
}
|
||||
|
||||
private List<SendMessageResult> sendMessage(SignalServiceDataMessage.Builder messageBuilder, Collection<SignalServiceAddress> recipients)
|
||||
throws IOException {
|
||||
if (messagePipe == null) {
|
||||
messagePipe = getMessageReceiver().createMessagePipe();
|
||||
}
|
||||
|
@ -1165,7 +1158,7 @@ public class Manager implements Signal {
|
|||
if (message.getGroupInfo().isPresent()) {
|
||||
try {
|
||||
final boolean isRecipientUpdate = false;
|
||||
List<SendMessageResult> result = messageSender.sendMessage(new ArrayList<>(recipientsTS), getAccessFor(recipientsTS), isRecipientUpdate, message);
|
||||
List<SendMessageResult> result = messageSender.sendMessage(new ArrayList<>(recipients), getAccessFor(recipients), isRecipientUpdate, message);
|
||||
for (SendMessageResult r : result) {
|
||||
if (r.getIdentityFailure() != null) {
|
||||
account.getSignalProtocolStore().saveIdentity(r.getAddress().getNumber().get(), r.getIdentityFailure().getIdentityKey(), TrustLevel.UNTRUSTED);
|
||||
|
@ -1176,8 +1169,8 @@ public class Manager implements Signal {
|
|||
account.getSignalProtocolStore().saveIdentity(e.getIdentifier(), e.getIdentityKey(), TrustLevel.UNTRUSTED);
|
||||
return Collections.emptyList();
|
||||
}
|
||||
} else if (recipientsTS.size() == 1 && recipientsTS.contains(getSelfAddress())) {
|
||||
SignalServiceAddress recipient = getSelfAddress();
|
||||
} else if (recipients.size() == 1 && recipients.contains(account.getSelfAddress())) {
|
||||
SignalServiceAddress recipient = account.getSelfAddress();
|
||||
final Optional<UnidentifiedAccessPair> unidentifiedAccess = getAccessFor(recipient);
|
||||
SentTranscriptMessage transcript = new SentTranscriptMessage(Optional.of(recipient),
|
||||
message.getTimestamp(),
|
||||
|
@ -1187,7 +1180,7 @@ public class Manager implements Signal {
|
|||
false);
|
||||
SignalServiceSyncMessage syncMessage = SignalServiceSyncMessage.forSentTranscript(transcript);
|
||||
|
||||
List<SendMessageResult> results = new ArrayList<>(recipientsTS.size());
|
||||
List<SendMessageResult> results = new ArrayList<>(recipients.size());
|
||||
try {
|
||||
messageSender.sendMessage(syncMessage, unidentifiedAccess);
|
||||
} catch (UntrustedIdentityException e) {
|
||||
|
@ -1197,8 +1190,8 @@ public class Manager implements Signal {
|
|||
return results;
|
||||
} else {
|
||||
// Send to all individually, so sync messages are sent correctly
|
||||
List<SendMessageResult> results = new ArrayList<>(recipientsTS.size());
|
||||
for (SignalServiceAddress address : recipientsTS) {
|
||||
List<SendMessageResult> results = new ArrayList<>(recipients.size());
|
||||
for (SignalServiceAddress address : recipients) {
|
||||
ThreadInfo thread = account.getThreadStore().getThread(address.getNumber().get());
|
||||
if (thread != null) {
|
||||
messageBuilder.withExpiration(thread.messageExpirationTime);
|
||||
|
@ -1218,7 +1211,7 @@ public class Manager implements Signal {
|
|||
}
|
||||
} finally {
|
||||
if (message != null && message.isEndSession()) {
|
||||
for (SignalServiceAddress recipient : recipientsTS) {
|
||||
for (SignalServiceAddress recipient : recipients) {
|
||||
handleEndSession(recipient.getNumber().get());
|
||||
}
|
||||
}
|
||||
|
@ -1227,7 +1220,7 @@ public class Manager implements Signal {
|
|||
}
|
||||
|
||||
private SignalServiceContent decryptMessage(SignalServiceEnvelope envelope) throws InvalidMetadataMessageException, ProtocolInvalidMessageException, ProtocolDuplicateMessageException, ProtocolLegacyMessageException, ProtocolInvalidKeyIdException, InvalidMetadataVersionException, ProtocolInvalidVersionException, ProtocolNoSessionException, ProtocolInvalidKeyException, ProtocolUntrustedIdentityException, SelfSendException, UnsupportedDataMessageException {
|
||||
SignalServiceCipher cipher = new SignalServiceCipher(getSelfAddress(), account.getSignalProtocolStore(), Utils.getCertificateValidator());
|
||||
SignalServiceCipher cipher = new SignalServiceCipher(account.getSelfAddress(), account.getSignalProtocolStore(), Utils.getCertificateValidator());
|
||||
try {
|
||||
return cipher.decrypt(envelope);
|
||||
} catch (ProtocolUntrustedIdentityException e) {
|
||||
|
@ -1241,7 +1234,7 @@ public class Manager implements Signal {
|
|||
account.getSignalProtocolStore().deleteAllSessions(source);
|
||||
}
|
||||
|
||||
private void handleSignalServiceDataMessage(SignalServiceDataMessage message, boolean isSync, String source, SignalServiceAddress destination, boolean ignoreAttachments) {
|
||||
private void handleSignalServiceDataMessage(SignalServiceDataMessage message, boolean isSync, SignalServiceAddress source, SignalServiceAddress destination, boolean ignoreAttachments) {
|
||||
String threadId;
|
||||
if (message.getGroupInfo().isPresent()) {
|
||||
SignalServiceGroup groupInfo = message.getGroupInfo().get();
|
||||
|
@ -1291,7 +1284,7 @@ public class Manager implements Signal {
|
|||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
group.members.remove(source);
|
||||
group.members.remove(source.getNumber().get());
|
||||
account.getGroupStore().updateGroup(group);
|
||||
}
|
||||
break;
|
||||
|
@ -1311,11 +1304,11 @@ public class Manager implements Signal {
|
|||
if (isSync) {
|
||||
threadId = destination.getNumber().get();
|
||||
} else {
|
||||
threadId = source;
|
||||
threadId = source.getNumber().get();
|
||||
}
|
||||
}
|
||||
if (message.isEndSession()) {
|
||||
handleEndSession(isSync ? destination.getNumber().get() : source);
|
||||
handleEndSession(isSync ? destination.getNumber().get() : source.getNumber().get());
|
||||
}
|
||||
if (message.isExpirationUpdate() || message.getBody().isPresent()) {
|
||||
ThreadInfo thread = account.getThreadStore().getThread(threadId);
|
||||
|
@ -1340,16 +1333,16 @@ public class Manager implements Signal {
|
|||
}
|
||||
}
|
||||
if (message.getProfileKey().isPresent() && message.getProfileKey().get().length == 32) {
|
||||
if (source.equals(username)) {
|
||||
if (source.equals(account.getSelfAddress())) {
|
||||
try {
|
||||
this.account.setProfileKey(new ProfileKey(message.getProfileKey().get()));
|
||||
} catch (InvalidInputException ignored) {
|
||||
}
|
||||
}
|
||||
ContactInfo contact = account.getContactStore().getContact(source);
|
||||
ContactInfo contact = account.getContactStore().getContact(source.getNumber().get());
|
||||
if (contact == null) {
|
||||
contact = new ContactInfo();
|
||||
contact.number = source;
|
||||
contact.number = source.getNumber().get();
|
||||
}
|
||||
contact.profileKey = Base64.encodeBytes(message.getProfileKey().get());
|
||||
account.getContactStore().updateContact(contact);
|
||||
|
@ -1516,14 +1509,14 @@ public class Manager implements Signal {
|
|||
}
|
||||
if (content.getDataMessage().isPresent()) {
|
||||
SignalServiceDataMessage message = content.getDataMessage().get();
|
||||
handleSignalServiceDataMessage(message, false, sender.getNumber().get(), getSelfAddress(), ignoreAttachments);
|
||||
handleSignalServiceDataMessage(message, false, sender, account.getSelfAddress(), ignoreAttachments);
|
||||
}
|
||||
if (content.getSyncMessage().isPresent()) {
|
||||
account.setMultiDevice(true);
|
||||
SignalServiceSyncMessage syncMessage = content.getSyncMessage().get();
|
||||
if (syncMessage.getSent().isPresent()) {
|
||||
SentTranscriptMessage message = syncMessage.getSent().get();
|
||||
handleSignalServiceDataMessage(message.getMessage(), true, sender.getNumber().get(), message.getDestination().orNull(), ignoreAttachments);
|
||||
handleSignalServiceDataMessage(message.getMessage(), true, sender, message.getDestination().orNull(), ignoreAttachments);
|
||||
}
|
||||
if (syncMessage.getRequest().isPresent()) {
|
||||
RequestMessage rm = syncMessage.getRequest().get();
|
||||
|
@ -1567,7 +1560,10 @@ public class Manager implements Signal {
|
|||
}
|
||||
syncGroup.addMembers(g.getMembers());
|
||||
if (!g.isActive()) {
|
||||
syncGroup.members.remove(username);
|
||||
syncGroup.members.remove(account.getUsername());
|
||||
} else {
|
||||
// Add ourself to the member set as it's marked as active
|
||||
syncGroup.members.add(account.getUsername());
|
||||
}
|
||||
syncGroup.blocked = g.isBlocked();
|
||||
if (g.getColor().isPresent()) {
|
||||
|
@ -1784,7 +1780,7 @@ public class Manager implements Signal {
|
|||
ThreadInfo info = account.getThreadStore().getThread(Base64.encodeBytes(record.groupId));
|
||||
out.write(new DeviceGroup(record.groupId, Optional.fromNullable(record.name),
|
||||
new ArrayList<>(record.getMembers()), createGroupAvatarAttachment(record.groupId),
|
||||
record.members.contains(username), Optional.fromNullable(info != null ? info.messageExpirationTime : null),
|
||||
record.members.contains(account.getUsername()), Optional.fromNullable(info != null ? info.messageExpirationTime : null),
|
||||
Optional.fromNullable(record.color), record.blocked, Optional.fromNullable(record.inboxPosition), record.archived));
|
||||
}
|
||||
}
|
||||
|
@ -1910,7 +1906,7 @@ public class Manager implements Signal {
|
|||
}
|
||||
|
||||
public Pair<String, List<JsonIdentityKeyStore.Identity>> getIdentities(String number) throws InvalidNumberException {
|
||||
String canonicalizedNumber = Utils.canonicalizeNumber(number, username);
|
||||
String canonicalizedNumber = Utils.canonicalizeNumber(number, account.getUsername());
|
||||
return new Pair<>(canonicalizedNumber, account.getSignalProtocolStore().getIdentities(canonicalizedNumber));
|
||||
}
|
||||
|
||||
|
@ -1995,7 +1991,7 @@ public class Manager implements Signal {
|
|||
}
|
||||
|
||||
public String computeSafetyNumber(String theirUsername, IdentityKey theirIdentityKey) {
|
||||
return Utils.computeSafetyNumber(username, getIdentity(), theirUsername, theirIdentityKey);
|
||||
return Utils.computeSafetyNumber(account.getUsername(), getIdentity(), theirUsername, theirIdentityKey);
|
||||
}
|
||||
|
||||
public interface ReceiveMessageHandler {
|
||||
|
|
|
@ -35,12 +35,9 @@ import java.net.URLDecoder;
|
|||
import java.net.URLEncoder;
|
||||
import java.nio.file.Files;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import static org.whispersystems.signalservice.internal.util.Util.isEmpty;
|
||||
|
||||
|
@ -149,29 +146,10 @@ class Utils {
|
|||
return new DeviceLinkInfo(deviceIdentifier, deviceKey);
|
||||
}
|
||||
|
||||
static Set<SignalServiceAddress> getSignalServiceAddresses(Collection<String> recipients, String localNumber) {
|
||||
Set<SignalServiceAddress> recipientsTS = new HashSet<>(recipients.size());
|
||||
for (String recipient : recipients) {
|
||||
try {
|
||||
recipientsTS.add(getPushAddress(recipient, localNumber));
|
||||
} catch (InvalidNumberException e) {
|
||||
System.err.println("Failed to add recipient \"" + recipient + "\": " + e.getMessage());
|
||||
System.err.println("Aborting sending.");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
return recipientsTS;
|
||||
}
|
||||
|
||||
static String canonicalizeNumber(String number, String localNumber) throws InvalidNumberException {
|
||||
return PhoneNumberFormatter.formatNumber(number, localNumber);
|
||||
}
|
||||
|
||||
private static SignalServiceAddress getPushAddress(String number, String localNumber) throws InvalidNumberException {
|
||||
String e164number = canonicalizeNumber(number, localNumber);
|
||||
return new SignalServiceAddress(null, e164number);
|
||||
}
|
||||
|
||||
static SignalServiceEnvelope loadEnvelope(File file) throws IOException {
|
||||
try (FileInputStream f = new FileInputStream(file)) {
|
||||
DataInputStream in = new DataInputStream(f);
|
||||
|
|
|
@ -32,6 +32,7 @@ import java.nio.channels.Channels;
|
|||
import java.nio.channels.FileChannel;
|
||||
import java.nio.channels.FileLock;
|
||||
import java.util.Collection;
|
||||
import java.util.UUID;
|
||||
|
||||
public class SignalAccount {
|
||||
|
||||
|
@ -39,6 +40,7 @@ public class SignalAccount {
|
|||
private FileChannel fileChannel;
|
||||
private FileLock lock;
|
||||
private String username;
|
||||
private UUID uuid;
|
||||
private int deviceId = SignalServiceAddress.DEFAULT_DEVICE_ID;
|
||||
private boolean isMultiDevice = false;
|
||||
private String password;
|
||||
|
@ -277,8 +279,12 @@ public class SignalAccount {
|
|||
return username;
|
||||
}
|
||||
|
||||
public UUID getUuid() {
|
||||
return uuid;
|
||||
}
|
||||
|
||||
public SignalServiceAddress getSelfAddress() {
|
||||
return new SignalServiceAddress(null, username);
|
||||
return new SignalServiceAddress(uuid, username);
|
||||
}
|
||||
|
||||
public int getDeviceId() {
|
||||
|
|
|
@ -55,7 +55,7 @@ public class JsonIdentityKeyStore implements IdentityKeyStore {
|
|||
*
|
||||
* @param name User name, i.e. phone number
|
||||
* @param identityKey The user's public key
|
||||
* @param trustLevel
|
||||
* @param trustLevel Level of trust: untrusted, trusted, trusted and verified
|
||||
* @param added Added timestamp, if null and the key is newly added, the current time is used.
|
||||
*/
|
||||
public boolean saveIdentity(String name, IdentityKey identityKey, TrustLevel trustLevel, Date added) {
|
||||
|
|
|
@ -8,6 +8,7 @@ import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException;
|
|||
import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.NetworkFailureException;
|
||||
import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException;
|
||||
import org.whispersystems.signalservice.api.util.InvalidNumberException;
|
||||
|
||||
import java.io.IOException;
|
||||
|
||||
|
@ -59,4 +60,10 @@ public class ErrorUtils {
|
|||
System.err.println(e.getMessage());
|
||||
System.err.println("Aborting sending.");
|
||||
}
|
||||
|
||||
public static void handleInvalidNumberException(InvalidNumberException e) {
|
||||
System.err.println("Failed to parse recipient: " + e.getMessage());
|
||||
System.err.println(e.getMessage());
|
||||
System.err.println("Aborting sending.");
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue