mirror of
https://github.com/AsamK/signal-cli
synced 2025-08-29 18:40:39 +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 {
|
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();
|
||||||
|
|
||||||
|
|
|
@ -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: ");
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 {
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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.");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue