Use SignalServiceAddress in more places

This commit is contained in:
AsamK 2020-03-23 17:09:56 +01:00
parent 8a44b37774
commit e2b7bda65b
11 changed files with 124 additions and 114 deletions

View file

@ -13,13 +13,13 @@ import java.util.List;
public interface Signal extends DBusInterface { 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; String getContactName(String number) throws InvalidNumberException;
@ -35,7 +35,7 @@ public interface Signal extends DBusInterface {
List<String> getGroupMembers(byte[] groupId); 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(); boolean isRegistered();

View file

@ -109,7 +109,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
System.out.println("Received sync read messages list"); System.out.println("Received sync read messages list");
for (ReadMessage rm : syncMessage.getRead().get()) { for (ReadMessage rm : syncMessage.getRead().get()) {
ContactInfo fromContact = m.getContact(rm.getSender().getNumber().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()) { if (syncMessage.getRequest().isPresent()) {
@ -144,7 +144,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
System.out.println("Blocked numbers:"); System.out.println("Blocked numbers:");
final BlockedListMessage blockedList = syncMessage.getBlockedList().get(); final BlockedListMessage blockedList = syncMessage.getBlockedList().get();
for (SignalServiceAddress address : blockedList.getAddresses()) { for (SignalServiceAddress address : blockedList.getAddresses()) {
System.out.println(" - " + address.getNumber()); System.out.println(" - " + address.getNumber().get());
} }
} }
if (syncMessage.getVerified().isPresent()) { if (syncMessage.getVerified().isPresent()) {
@ -168,7 +168,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
if (syncMessage.getViewOnceOpen().isPresent()) { if (syncMessage.getViewOnceOpen().isPresent()) {
final ViewOnceOpenMessage viewOnceOpenMessage = syncMessage.getViewOnceOpen().get(); final ViewOnceOpenMessage viewOnceOpenMessage = syncMessage.getViewOnceOpen().get();
System.out.println("Received sync message with view once open message:"); 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()); System.out.println(" - Timestamp:" + viewOnceOpenMessage.getTimestamp());
} }
if (syncMessage.getStickerPackOperations().isPresent()) { if (syncMessage.getStickerPackOperations().isPresent()) {
@ -322,7 +322,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
final SignalServiceDataMessage.Reaction reaction = message.getReaction().get(); final SignalServiceDataMessage.Reaction reaction = message.getReaction().get();
System.out.println("Reaction:"); System.out.println("Reaction:");
System.out.println(" - Emoji: " + reaction.getEmoji()); 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(" - Target timestamp: " + reaction.getTargetSentTimestamp());
System.out.println(" - Is remove: " + reaction.isRemove()); System.out.println(" - Is remove: " + reaction.isRemove());
} }
@ -330,7 +330,7 @@ public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
if (message.getQuote().isPresent()) { if (message.getQuote().isPresent()) {
SignalServiceDataMessage.Quote quote = message.getQuote().get(); SignalServiceDataMessage.Quote quote = message.getQuote().get();
System.out.println("Quote: (" + quote.getId() + ")"); 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()); System.out.println(" Text: " + quote.getText());
if (quote.getAttachments().size() > 0) { if (quote.getAttachments().size() > 0) {
System.out.println(" Attachments: "); System.out.println(" Attachments: ");

View file

@ -9,6 +9,7 @@ import org.asamk.signal.NotAGroupMemberException;
import org.asamk.signal.manager.Manager; import org.asamk.signal.manager.Manager;
import org.asamk.signal.util.Util; import org.asamk.signal.util.Util;
import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions; import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions;
import org.whispersystems.signalservice.api.util.InvalidNumberException;
import java.io.IOException; 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.handleGroupIdFormatException;
import static org.asamk.signal.util.ErrorUtils.handleGroupNotFoundException; import static org.asamk.signal.util.ErrorUtils.handleGroupNotFoundException;
import static org.asamk.signal.util.ErrorUtils.handleIOException; import static org.asamk.signal.util.ErrorUtils.handleIOException;
import static org.asamk.signal.util.ErrorUtils.handleInvalidNumberException;
import static org.asamk.signal.util.ErrorUtils.handleNotAGroupMemberException; import static org.asamk.signal.util.ErrorUtils.handleNotAGroupMemberException;
public class QuitGroupCommand implements LocalCommand { public class QuitGroupCommand implements LocalCommand {
@ -56,6 +58,9 @@ public class QuitGroupCommand implements LocalCommand {
} catch (GroupIdFormatException e) { } catch (GroupIdFormatException e) {
handleGroupIdFormatException(e); handleGroupIdFormatException(e);
return 1; return 1;
} catch (InvalidNumberException e) {
handleInvalidNumberException(e);
return 1;
} }
} }
} }

View file

@ -13,6 +13,7 @@ import org.asamk.signal.util.IOUtils;
import org.asamk.signal.util.Util; import org.asamk.signal.util.Util;
import org.freedesktop.dbus.exceptions.DBusExecutionException; import org.freedesktop.dbus.exceptions.DBusExecutionException;
import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions; import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions;
import org.whispersystems.signalservice.api.util.InvalidNumberException;
import java.io.IOException; import java.io.IOException;
import java.nio.charset.Charset; 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.handleGroupIdFormatException;
import static org.asamk.signal.util.ErrorUtils.handleGroupNotFoundException; import static org.asamk.signal.util.ErrorUtils.handleGroupNotFoundException;
import static org.asamk.signal.util.ErrorUtils.handleIOException; import static org.asamk.signal.util.ErrorUtils.handleIOException;
import static org.asamk.signal.util.ErrorUtils.handleInvalidNumberException;
import static org.asamk.signal.util.ErrorUtils.handleNotAGroupMemberException; import static org.asamk.signal.util.ErrorUtils.handleNotAGroupMemberException;
public class SendCommand implements DbusCommand { public class SendCommand implements DbusCommand {
@ -75,6 +77,9 @@ public class SendCommand implements DbusCommand {
} catch (DBusExecutionException e) { } catch (DBusExecutionException e) {
handleDBusExecutionException(e); handleDBusExecutionException(e);
return 1; return 1;
} catch (InvalidNumberException e) {
handleInvalidNumberException(e);
return 1;
} }
} }
@ -126,6 +131,9 @@ public class SendCommand implements DbusCommand {
} catch (GroupIdFormatException e) { } catch (GroupIdFormatException e) {
handleGroupIdFormatException(e); handleGroupIdFormatException(e);
return 1; return 1;
} catch (InvalidNumberException e) {
handleInvalidNumberException(e);
return 1;
} }
} }
} }

View file

@ -11,6 +11,7 @@ import org.asamk.signal.manager.Manager;
import org.asamk.signal.util.Util; import org.asamk.signal.util.Util;
import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions; import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions;
import org.whispersystems.signalservice.api.util.InvalidNumberException;
import java.io.IOException; 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.handleGroupIdFormatException;
import static org.asamk.signal.util.ErrorUtils.handleGroupNotFoundException; import static org.asamk.signal.util.ErrorUtils.handleGroupNotFoundException;
import static org.asamk.signal.util.ErrorUtils.handleIOException; import static org.asamk.signal.util.ErrorUtils.handleIOException;
import static org.asamk.signal.util.ErrorUtils.handleInvalidNumberException;
import static org.asamk.signal.util.ErrorUtils.handleNotAGroupMemberException; import static org.asamk.signal.util.ErrorUtils.handleNotAGroupMemberException;
public class SendReactionCommand implements LocalCommand { public class SendReactionCommand implements LocalCommand {
@ -90,6 +92,9 @@ public class SendReactionCommand implements LocalCommand {
} catch (GroupIdFormatException e) { } catch (GroupIdFormatException e) {
handleGroupIdFormatException(e); handleGroupIdFormatException(e);
return 1; return 1;
} catch (InvalidNumberException e) {
handleInvalidNumberException(e);
return 1;
} }
} }
} }

View file

@ -10,6 +10,7 @@ import org.asamk.signal.GroupNotFoundException;
import org.asamk.signal.NotAGroupMemberException; import org.asamk.signal.NotAGroupMemberException;
import org.asamk.signal.util.Util; import org.asamk.signal.util.Util;
import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions; import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions;
import org.whispersystems.signalservice.api.util.InvalidNumberException;
import org.whispersystems.util.Base64; import org.whispersystems.util.Base64;
import java.io.IOException; 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.handleGroupIdFormatException;
import static org.asamk.signal.util.ErrorUtils.handleGroupNotFoundException; import static org.asamk.signal.util.ErrorUtils.handleGroupNotFoundException;
import static org.asamk.signal.util.ErrorUtils.handleIOException; import static org.asamk.signal.util.ErrorUtils.handleIOException;
import static org.asamk.signal.util.ErrorUtils.handleInvalidNumberException;
import static org.asamk.signal.util.ErrorUtils.handleNotAGroupMemberException; import static org.asamk.signal.util.ErrorUtils.handleNotAGroupMemberException;
public class UpdateGroupCommand implements DbusCommand { public class UpdateGroupCommand implements DbusCommand {
@ -88,6 +90,9 @@ public class UpdateGroupCommand implements DbusCommand {
} catch (GroupIdFormatException e) { } catch (GroupIdFormatException e) {
handleGroupIdFormatException(e); handleGroupIdFormatException(e);
return 1; return 1;
} catch (InvalidNumberException e) {
handleInvalidNumberException(e);
return 1;
} }
} }
} }

View file

@ -171,10 +171,6 @@ public class Manager implements Signal {
return username; return username;
} }
private SignalServiceAddress getSelfAddress() {
return new SignalServiceAddress(null, username);
}
private SignalServiceAccountManager getSignalServiceAccountManager() { private SignalServiceAccountManager getSignalServiceAccountManager() {
return new SignalServiceAccountManager(BaseConfig.serviceConfiguration, null, account.getUsername(), account.getPassword(), account.getDeviceId(), BaseConfig.USER_AGENT, timer); 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() { 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() { 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()); 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); throw new GroupNotFoundException(groupId);
} }
for (String member : g.members) { for (String member : g.members) {
if (member.equals(this.username)) { if (member.equals(account.getUsername())) {
return g; return g;
} }
} }
@ -518,7 +514,7 @@ public class Manager implements Signal {
@Override @Override
public void sendGroupMessage(String messageText, List<String> attachments, public void sendGroupMessage(String messageText, List<String> attachments,
byte[] groupId) byte[] groupId)
throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException { throws IOException, EncapsulatedExceptions, GroupNotFoundException, AttachmentInvalidException, InvalidNumberException {
final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder().withBody(messageText); final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder().withBody(messageText);
if (attachments != null) { if (attachments != null) {
messageBuilder.withAttachments(Utils.getSignalServiceAttachments(attachments)); messageBuilder.withAttachments(Utils.getSignalServiceAttachments(attachments));
@ -536,15 +532,15 @@ public class Manager implements Signal {
final GroupInfo g = getGroupForSending(groupId); final GroupInfo g = getGroupForSending(groupId);
final Collection<SignalServiceAddress> membersSend = getSignalServiceAddresses(g.members);
// Don't send group message to ourself // Don't send group message to ourself
final List<String> membersSend = new ArrayList<>(g.members); membersSend.remove(account.getSelfAddress());
membersSend.remove(this.username);
sendMessageLegacy(messageBuilder, membersSend); sendMessageLegacy(messageBuilder, membersSend);
} }
public void sendGroupMessageReaction(String emoji, boolean remove, SignalServiceAddress targetAuthor, public void sendGroupMessageReaction(String emoji, boolean remove, SignalServiceAddress targetAuthor,
long targetSentTimestamp, byte[] groupId) long targetSentTimestamp, byte[] groupId)
throws IOException, EncapsulatedExceptions, AttachmentInvalidException { throws IOException, EncapsulatedExceptions, AttachmentInvalidException, InvalidNumberException {
SignalServiceDataMessage.Reaction reaction = new SignalServiceDataMessage.Reaction(emoji, remove, targetAuthor, targetSentTimestamp); SignalServiceDataMessage.Reaction reaction = new SignalServiceDataMessage.Reaction(emoji, remove, targetAuthor, targetSentTimestamp);
final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder() final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder()
.withReaction(reaction) .withReaction(reaction)
@ -556,13 +552,13 @@ public class Manager implements Signal {
messageBuilder.asGroupMessage(group); messageBuilder.asGroupMessage(group);
} }
final GroupInfo g = getGroupForSending(groupId); final GroupInfo g = getGroupForSending(groupId);
final Collection<SignalServiceAddress> membersSend = getSignalServiceAddresses(g.members);
// Don't send group message to ourself // Don't send group message to ourself
final List<String> membersSend = new ArrayList<>(g.members); membersSend.remove(account.getSelfAddress());
membersSend.remove(this.username);
sendMessageLegacy(messageBuilder, membersSend); 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) SignalServiceGroup group = SignalServiceGroup.newBuilder(SignalServiceGroup.Type.QUIT)
.withId(groupId) .withId(groupId)
.build(); .build();
@ -571,18 +567,18 @@ public class Manager implements Signal {
.asGroupMessage(group); .asGroupMessage(group);
final GroupInfo g = getGroupForSending(groupId); final GroupInfo g = getGroupForSending(groupId);
g.members.remove(this.username); g.members.remove(account.getUsername());
account.getGroupStore().updateGroup(g); 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; GroupInfo g;
if (groupId == null) { if (groupId == null) {
// Create new group // Create new group
g = new GroupInfo(KeyUtils.createGroupId()); g = new GroupInfo(KeyUtils.createGroupId());
g.members.add(username); g.members.add(account.getUsername());
} else { } else {
g = getGroupForSending(groupId); g = getGroupForSending(groupId);
} }
@ -594,13 +590,7 @@ public class Manager implements Signal {
if (members != null) { if (members != null) {
Set<String> newMembers = new HashSet<>(); Set<String> newMembers = new HashSet<>();
for (String member : members) { for (String member : members) {
try { member = Utils.canonicalizeNumber(member, account.getUsername());
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);
}
if (g.members.contains(member)) { if (g.members.contains(member)) {
continue; continue;
} }
@ -629,29 +619,27 @@ public class Manager implements Signal {
SignalServiceDataMessage.Builder messageBuilder = getGroupUpdateMessageBuilder(g); SignalServiceDataMessage.Builder messageBuilder = getGroupUpdateMessageBuilder(g);
final Collection<SignalServiceAddress> membersSend = getSignalServiceAddresses(g.members);
// Don't send group message to ourself // Don't send group message to ourself
final List<String> membersSend = new ArrayList<>(g.members); membersSend.remove(account.getSelfAddress());
membersSend.remove(this.username);
sendMessageLegacy(messageBuilder, membersSend); sendMessageLegacy(messageBuilder, membersSend);
return g.groupId; 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) { if (groupId == null) {
return; return;
} }
GroupInfo g = getGroupForSending(groupId); GroupInfo g = getGroupForSending(groupId);
if (!g.members.contains(recipient)) { if (!g.members.contains(recipient.getNumber().get())) {
return; return;
} }
SignalServiceDataMessage.Builder messageBuilder = getGroupUpdateMessageBuilder(g); SignalServiceDataMessage.Builder messageBuilder = getGroupUpdateMessageBuilder(g);
// Send group message only to the recipient who requested it // Send group message only to the recipient who requested it
final List<String> membersSend = new ArrayList<>(); sendMessageLegacy(messageBuilder, Collections.singleton(recipient));
membersSend.add(recipient);
sendMessageLegacy(messageBuilder, membersSend);
} }
private SignalServiceDataMessage.Builder getGroupUpdateMessageBuilder(GroupInfo g) { private SignalServiceDataMessage.Builder getGroupUpdateMessageBuilder(GroupInfo g) {
@ -680,7 +668,7 @@ public class Manager implements Signal {
return messageBuilder; 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) { if (groupId == null) {
return; 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 // Send group info request message to the recipient who sent us a message with this groupId
final List<String> membersSend = new ArrayList<>(); sendMessageLegacy(messageBuilder, Collections.singleton(recipient));
membersSend.add(recipient);
sendMessageLegacy(messageBuilder, membersSend);
} }
@Override @Override
public void sendMessage(String message, List<String> attachments, String recipient) 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); List<String> recipients = new ArrayList<>(1);
recipients.add(recipient); recipients.add(recipient);
sendMessage(message, attachments, recipients); sendMessage(message, attachments, recipients);
@ -713,7 +699,7 @@ public class Manager implements Signal {
@Override @Override
public void sendMessage(String messageText, List<String> attachments, public void sendMessage(String messageText, List<String> attachments,
List<String> recipients) List<String> recipients)
throws IOException, EncapsulatedExceptions, AttachmentInvalidException { throws IOException, EncapsulatedExceptions, AttachmentInvalidException, InvalidNumberException {
final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder().withBody(messageText); final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder().withBody(messageText);
if (attachments != null) { if (attachments != null) {
List<SignalServiceAttachment> attachmentStreams = Utils.getSignalServiceAttachments(attachments); List<SignalServiceAttachment> attachmentStreams = Utils.getSignalServiceAttachments(attachments);
@ -732,30 +718,30 @@ public class Manager implements Signal {
messageBuilder.withAttachments(attachmentPointers); messageBuilder.withAttachments(attachmentPointers);
} }
messageBuilder.withProfileKey(account.getProfileKey().serialize()); messageBuilder.withProfileKey(account.getProfileKey().serialize());
sendMessageLegacy(messageBuilder, recipients); sendMessageLegacy(messageBuilder, getSignalServiceAddresses(recipients));
} }
public void sendMessageReaction(String emoji, boolean remove, SignalServiceAddress targetAuthor, public void sendMessageReaction(String emoji, boolean remove, SignalServiceAddress targetAuthor,
long targetSentTimestamp, List<String> recipients) long targetSentTimestamp, List<String> recipients)
throws IOException, EncapsulatedExceptions, AttachmentInvalidException { throws IOException, EncapsulatedExceptions, AttachmentInvalidException, InvalidNumberException {
SignalServiceDataMessage.Reaction reaction = new SignalServiceDataMessage.Reaction(emoji, remove, targetAuthor, targetSentTimestamp); SignalServiceDataMessage.Reaction reaction = new SignalServiceDataMessage.Reaction(emoji, remove, targetAuthor, targetSentTimestamp);
final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder() final SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder()
.withReaction(reaction) .withReaction(reaction)
.withProfileKey(account.getProfileKey().serialize()); .withProfileKey(account.getProfileKey().serialize());
sendMessageLegacy(messageBuilder, recipients); sendMessageLegacy(messageBuilder, getSignalServiceAddresses(recipients));
} }
@Override @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() SignalServiceDataMessage.Builder messageBuilder = SignalServiceDataMessage.newBuilder()
.asEndSessionMessage(); .asEndSessionMessage();
sendMessageLegacy(messageBuilder, recipients); sendMessageLegacy(messageBuilder, getSignalServiceAddresses(recipients));
} }
@Override @Override
public String getContactName(String number) throws InvalidNumberException { 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); ContactInfo contact = account.getContactStore().getContact(canonicalizedNumber);
if (contact == null) { if (contact == null) {
return ""; return "";
@ -766,7 +752,7 @@ public class Manager implements Signal {
@Override @Override
public void setContactName(String number, String name) throws InvalidNumberException { 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); ContactInfo contact = account.getContactStore().getContact(canonicalizedNumber);
if (contact == null) { if (contact == null) {
contact = new ContactInfo(); contact = new ContactInfo();
@ -782,7 +768,7 @@ public class Manager implements Signal {
@Override @Override
public void setContactBlocked(String number, boolean blocked) throws InvalidNumberException { 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); ContactInfo contact = account.getContactStore().getContact(number);
if (contact == null) { if (contact == null) {
contact = new ContactInfo(); contact = new ContactInfo();
@ -840,7 +826,7 @@ public class Manager implements Signal {
} }
@Override @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) { if (groupId.length == 0) {
groupId = null; groupId = null;
} }
@ -858,9 +844,6 @@ public class Manager implements Signal {
/** /**
* Change the expiration timer for a thread (number of groupId) * Change the expiration timer for a thread (number of groupId)
*
* @param numberOrGroupId
* @param messageExpirationTimer
*/ */
public void setExpirationTimer(String numberOrGroupId, int messageExpirationTimer) { public void setExpirationTimer(String numberOrGroupId, int messageExpirationTimer) {
ThreadInfo thread = account.getThreadStore().getThread(numberOrGroupId); ThreadInfo thread = account.getThreadStore().getThread(numberOrGroupId);
@ -953,7 +936,7 @@ public class Manager implements Signal {
stickers); stickers);
} }
private static JsonStickerPack parseStickerPack(String rootPath, ZipFile zip) throws IOException, StickerPackInvalidException { private static JsonStickerPack parseStickerPack(String rootPath, ZipFile zip) throws IOException {
InputStream inputStream; InputStream inputStream;
if (zip != null) { if (zip != null) {
inputStream = zip.getInputStream(zip.getEntry("manifest.json")); 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. * 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 { throws EncapsulatedExceptions, IOException {
List<SendMessageResult> results = sendMessage(messageBuilder, recipients); 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) private Collection<SignalServiceAddress> getSignalServiceAddresses(Collection<String> numbers) throws InvalidNumberException {
throws IOException { final Set<SignalServiceAddress> signalServiceAddresses = new HashSet<>(numbers.size());
Set<SignalServiceAddress> recipientsTS = Utils.getSignalServiceAddresses(recipients, username); final String username = account.getUsername();
if (recipientsTS == null) {
account.save(); for (String number : numbers) {
return Collections.emptyList(); 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) { if (messagePipe == null) {
messagePipe = getMessageReceiver().createMessagePipe(); messagePipe = getMessageReceiver().createMessagePipe();
} }
@ -1165,7 +1158,7 @@ public class Manager implements Signal {
if (message.getGroupInfo().isPresent()) { if (message.getGroupInfo().isPresent()) {
try { try {
final boolean isRecipientUpdate = false; 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) { for (SendMessageResult r : result) {
if (r.getIdentityFailure() != null) { if (r.getIdentityFailure() != null) {
account.getSignalProtocolStore().saveIdentity(r.getAddress().getNumber().get(), r.getIdentityFailure().getIdentityKey(), TrustLevel.UNTRUSTED); 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); account.getSignalProtocolStore().saveIdentity(e.getIdentifier(), e.getIdentityKey(), TrustLevel.UNTRUSTED);
return Collections.emptyList(); return Collections.emptyList();
} }
} else if (recipientsTS.size() == 1 && recipientsTS.contains(getSelfAddress())) { } else if (recipients.size() == 1 && recipients.contains(account.getSelfAddress())) {
SignalServiceAddress recipient = getSelfAddress(); SignalServiceAddress recipient = account.getSelfAddress();
final Optional<UnidentifiedAccessPair> unidentifiedAccess = getAccessFor(recipient); final Optional<UnidentifiedAccessPair> unidentifiedAccess = getAccessFor(recipient);
SentTranscriptMessage transcript = new SentTranscriptMessage(Optional.of(recipient), SentTranscriptMessage transcript = new SentTranscriptMessage(Optional.of(recipient),
message.getTimestamp(), message.getTimestamp(),
@ -1187,7 +1180,7 @@ public class Manager implements Signal {
false); false);
SignalServiceSyncMessage syncMessage = SignalServiceSyncMessage.forSentTranscript(transcript); SignalServiceSyncMessage syncMessage = SignalServiceSyncMessage.forSentTranscript(transcript);
List<SendMessageResult> results = new ArrayList<>(recipientsTS.size()); List<SendMessageResult> results = new ArrayList<>(recipients.size());
try { try {
messageSender.sendMessage(syncMessage, unidentifiedAccess); messageSender.sendMessage(syncMessage, unidentifiedAccess);
} catch (UntrustedIdentityException e) { } catch (UntrustedIdentityException e) {
@ -1197,8 +1190,8 @@ public class Manager implements Signal {
return results; return results;
} else { } else {
// Send to all individually, so sync messages are sent correctly // Send to all individually, so sync messages are sent correctly
List<SendMessageResult> results = new ArrayList<>(recipientsTS.size()); List<SendMessageResult> results = new ArrayList<>(recipients.size());
for (SignalServiceAddress address : recipientsTS) { for (SignalServiceAddress address : recipients) {
ThreadInfo thread = account.getThreadStore().getThread(address.getNumber().get()); ThreadInfo thread = account.getThreadStore().getThread(address.getNumber().get());
if (thread != null) { if (thread != null) {
messageBuilder.withExpiration(thread.messageExpirationTime); messageBuilder.withExpiration(thread.messageExpirationTime);
@ -1218,7 +1211,7 @@ public class Manager implements Signal {
} }
} finally { } finally {
if (message != null && message.isEndSession()) { if (message != null && message.isEndSession()) {
for (SignalServiceAddress recipient : recipientsTS) { for (SignalServiceAddress recipient : recipients) {
handleEndSession(recipient.getNumber().get()); 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 { 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 { try {
return cipher.decrypt(envelope); return cipher.decrypt(envelope);
} catch (ProtocolUntrustedIdentityException e) { } catch (ProtocolUntrustedIdentityException e) {
@ -1241,7 +1234,7 @@ public class Manager implements Signal {
account.getSignalProtocolStore().deleteAllSessions(source); 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; String threadId;
if (message.getGroupInfo().isPresent()) { if (message.getGroupInfo().isPresent()) {
SignalServiceGroup groupInfo = message.getGroupInfo().get(); SignalServiceGroup groupInfo = message.getGroupInfo().get();
@ -1291,7 +1284,7 @@ public class Manager implements Signal {
e.printStackTrace(); e.printStackTrace();
} }
} else { } else {
group.members.remove(source); group.members.remove(source.getNumber().get());
account.getGroupStore().updateGroup(group); account.getGroupStore().updateGroup(group);
} }
break; break;
@ -1311,11 +1304,11 @@ public class Manager implements Signal {
if (isSync) { if (isSync) {
threadId = destination.getNumber().get(); threadId = destination.getNumber().get();
} else { } else {
threadId = source; threadId = source.getNumber().get();
} }
} }
if (message.isEndSession()) { if (message.isEndSession()) {
handleEndSession(isSync ? destination.getNumber().get() : source); handleEndSession(isSync ? destination.getNumber().get() : source.getNumber().get());
} }
if (message.isExpirationUpdate() || message.getBody().isPresent()) { if (message.isExpirationUpdate() || message.getBody().isPresent()) {
ThreadInfo thread = account.getThreadStore().getThread(threadId); 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 (message.getProfileKey().isPresent() && message.getProfileKey().get().length == 32) {
if (source.equals(username)) { if (source.equals(account.getSelfAddress())) {
try { try {
this.account.setProfileKey(new ProfileKey(message.getProfileKey().get())); this.account.setProfileKey(new ProfileKey(message.getProfileKey().get()));
} catch (InvalidInputException ignored) { } catch (InvalidInputException ignored) {
} }
} }
ContactInfo contact = account.getContactStore().getContact(source); ContactInfo contact = account.getContactStore().getContact(source.getNumber().get());
if (contact == null) { if (contact == null) {
contact = new ContactInfo(); contact = new ContactInfo();
contact.number = source; contact.number = source.getNumber().get();
} }
contact.profileKey = Base64.encodeBytes(message.getProfileKey().get()); contact.profileKey = Base64.encodeBytes(message.getProfileKey().get());
account.getContactStore().updateContact(contact); account.getContactStore().updateContact(contact);
@ -1516,14 +1509,14 @@ public class Manager implements Signal {
} }
if (content.getDataMessage().isPresent()) { if (content.getDataMessage().isPresent()) {
SignalServiceDataMessage message = content.getDataMessage().get(); SignalServiceDataMessage message = content.getDataMessage().get();
handleSignalServiceDataMessage(message, false, sender.getNumber().get(), getSelfAddress(), ignoreAttachments); handleSignalServiceDataMessage(message, false, sender, account.getSelfAddress(), ignoreAttachments);
} }
if (content.getSyncMessage().isPresent()) { if (content.getSyncMessage().isPresent()) {
account.setMultiDevice(true); account.setMultiDevice(true);
SignalServiceSyncMessage syncMessage = content.getSyncMessage().get(); SignalServiceSyncMessage syncMessage = content.getSyncMessage().get();
if (syncMessage.getSent().isPresent()) { if (syncMessage.getSent().isPresent()) {
SentTranscriptMessage message = syncMessage.getSent().get(); 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()) { if (syncMessage.getRequest().isPresent()) {
RequestMessage rm = syncMessage.getRequest().get(); RequestMessage rm = syncMessage.getRequest().get();
@ -1567,7 +1560,10 @@ public class Manager implements Signal {
} }
syncGroup.addMembers(g.getMembers()); syncGroup.addMembers(g.getMembers());
if (!g.isActive()) { 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(); syncGroup.blocked = g.isBlocked();
if (g.getColor().isPresent()) { if (g.getColor().isPresent()) {
@ -1784,7 +1780,7 @@ public class Manager implements Signal {
ThreadInfo info = account.getThreadStore().getThread(Base64.encodeBytes(record.groupId)); ThreadInfo info = account.getThreadStore().getThread(Base64.encodeBytes(record.groupId));
out.write(new DeviceGroup(record.groupId, Optional.fromNullable(record.name), out.write(new DeviceGroup(record.groupId, Optional.fromNullable(record.name),
new ArrayList<>(record.getMembers()), createGroupAvatarAttachment(record.groupId), 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)); 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 { 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)); return new Pair<>(canonicalizedNumber, account.getSignalProtocolStore().getIdentities(canonicalizedNumber));
} }
@ -1995,7 +1991,7 @@ public class Manager implements Signal {
} }
public String computeSafetyNumber(String theirUsername, IdentityKey theirIdentityKey) { 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 { public interface ReceiveMessageHandler {

View file

@ -35,12 +35,9 @@ import java.net.URLDecoder;
import java.net.URLEncoder; import java.net.URLEncoder;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set;
import static org.whispersystems.signalservice.internal.util.Util.isEmpty; import static org.whispersystems.signalservice.internal.util.Util.isEmpty;
@ -149,29 +146,10 @@ class Utils {
return new DeviceLinkInfo(deviceIdentifier, deviceKey); 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 { static String canonicalizeNumber(String number, String localNumber) throws InvalidNumberException {
return PhoneNumberFormatter.formatNumber(number, localNumber); 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 { static SignalServiceEnvelope loadEnvelope(File file) throws IOException {
try (FileInputStream f = new FileInputStream(file)) { try (FileInputStream f = new FileInputStream(file)) {
DataInputStream in = new DataInputStream(f); DataInputStream in = new DataInputStream(f);

View file

@ -32,6 +32,7 @@ import java.nio.channels.Channels;
import java.nio.channels.FileChannel; import java.nio.channels.FileChannel;
import java.nio.channels.FileLock; import java.nio.channels.FileLock;
import java.util.Collection; import java.util.Collection;
import java.util.UUID;
public class SignalAccount { public class SignalAccount {
@ -39,6 +40,7 @@ public class SignalAccount {
private FileChannel fileChannel; private FileChannel fileChannel;
private FileLock lock; private FileLock lock;
private String username; private String username;
private UUID uuid;
private int deviceId = SignalServiceAddress.DEFAULT_DEVICE_ID; private int deviceId = SignalServiceAddress.DEFAULT_DEVICE_ID;
private boolean isMultiDevice = false; private boolean isMultiDevice = false;
private String password; private String password;
@ -277,8 +279,12 @@ public class SignalAccount {
return username; return username;
} }
public UUID getUuid() {
return uuid;
}
public SignalServiceAddress getSelfAddress() { public SignalServiceAddress getSelfAddress() {
return new SignalServiceAddress(null, username); return new SignalServiceAddress(uuid, username);
} }
public int getDeviceId() { public int getDeviceId() {

View file

@ -55,7 +55,7 @@ public class JsonIdentityKeyStore implements IdentityKeyStore {
* *
* @param name User name, i.e. phone number * @param name User name, i.e. phone number
* @param identityKey The user's public key * @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. * @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) { public boolean saveIdentity(String name, IdentityKey identityKey, TrustLevel trustLevel, Date added) {

View file

@ -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.EncapsulatedExceptions;
import org.whispersystems.signalservice.api.push.exceptions.NetworkFailureException; import org.whispersystems.signalservice.api.push.exceptions.NetworkFailureException;
import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException; import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException;
import org.whispersystems.signalservice.api.util.InvalidNumberException;
import java.io.IOException; import java.io.IOException;
@ -59,4 +60,10 @@ public class ErrorUtils {
System.err.println(e.getMessage()); System.err.println(e.getMessage());
System.err.println("Aborting sending."); 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.");
}
} }