}
dependencies {
- api("com.github.turasa:signal-service-java:2.15.3_unofficial_22")
+ api("com.github.turasa:signal-service-java:2.15.3_unofficial_23")
implementation("com.google.protobuf:protobuf-javalite:3.10.0")
implementation("org.bouncycastle:bcprov-jdk15on:1.68")
implementation("org.slf4j:slf4j-api:1.7.30")
}
private File getContactAvatarFile(SignalServiceAddress address) {
- return new File(avatarsPath, "contact-" + address.getLegacyIdentifier());
+ return new File(avatarsPath, "contact-" + getLegacyIdentifier(address));
+ }
+
+ private String getLegacyIdentifier(final SignalServiceAddress address) {
+ return address.getNumber().or(() -> address.getUuid().get().toString());
}
private File getProfileAvatarFile(SignalServiceAddress address) {
- return new File(avatarsPath, "profile-" + address.getLegacyIdentifier());
+ return new File(avatarsPath, "profile-" + getLegacyIdentifier(address));
}
private void createAvatarsDir() throws IOException {
}
} catch (InvalidKeyException ignored) {
logger.warn("Got invalid identity key in profile for {}",
- resolveSignalServiceAddress(recipientId).getLegacyIdentifier());
+ resolveSignalServiceAddress(recipientId).getIdentifier());
}
return profileAndCredential;
}
final var noUuidCapability = members.stream()
.map(addressResolver::resolveSignalServiceAddress)
.filter(address -> !address.getUuid().isPresent())
- .map(SignalServiceAddress::getLegacyIdentifier)
+ .map(SignalServiceAddress::getNumber)
+ .map(Optional::get)
.collect(Collectors.toSet());
if (noUuidCapability.size() > 0) {
logger.warn("Cannot create a V2 group as some members don't have a UUID: {}",
out.writeInt(0);
}
out.writeLong(envelope.getServerReceivedTimestamp());
- var uuid = envelope.getUuid();
+ var uuid = envelope.getServerGuid();
out.writeUTF(uuid == null ? "" : uuid);
out.writeLong(envelope.getServerDeliveredTimestamp());
}
import java.util.ArrayList;
import java.util.List;
+import static org.asamk.signal.util.Util.getLegacyIdentifier;
+
public class JsonDbusReceiveMessageHandler extends JsonReceiveMessageHandler {
private final DBusConnection conn;
try {
conn.sendMessage(new Signal.ReceiptReceived(objectPath, envelope.getTimestamp(),
// A receipt envelope always has a source address
- envelope.getSourceAddress().getLegacyIdentifier()));
+ getLegacyIdentifier(envelope.getSourceAddress())));
} catch (DBusException e) {
e.printStackTrace();
}
try {
conn.sendMessage(new Signal.ReceiptReceived(objectPath,
timestamp,
- sender.getLegacyIdentifier()));
+ getLegacyIdentifier(sender)));
} catch (DBusException e) {
e.printStackTrace();
}
try {
conn.sendMessage(new Signal.MessageReceived(objectPath,
message.getTimestamp(),
- sender.getLegacyIdentifier(),
+ getLegacyIdentifier(sender),
groupId != null ? groupId : new byte[0],
message.getBody().isPresent() ? message.getBody().get() : "",
JsonDbusReceiveMessageHandler.getAttachments(message, m)));
try {
conn.sendMessage(new Signal.SyncMessageReceived(objectPath,
transcript.getTimestamp(),
- sender.getLegacyIdentifier(),
- transcript.getDestination().isPresent() ? transcript.getDestination()
- .get()
- .getLegacyIdentifier() : "",
+ getLegacyIdentifier(sender),
+ transcript.getDestination().isPresent()
+ ? getLegacyIdentifier(transcript.getDestination().get())
+ : "",
groupId != null ? groupId : new byte[0],
message.getBody().isPresent() ? message.getBody().get() : "",
JsonDbusReceiveMessageHandler.getAttachments(message, m)));
import java.util.Base64;
import java.util.stream.Collectors;
+import static org.asamk.signal.util.Util.getLegacyIdentifier;
+
public class ReceiveMessageHandler implements Manager.ReceiveMessageHandler {
final Manager m;
var e = (ProtocolUntrustedIdentityException) exception;
writer.println(
"The user’s key is untrusted, either the user has reinstalled Signal or a third party sent this message.");
- final var recipientName = m.resolveSignalServiceAddress(e.getSender()).getLegacyIdentifier();
+ final var recipientName = getLegacyIdentifier(m.resolveSignalServiceAddress(e.getSender()));
writer.println(
"Use 'signal-cli -u {} listIdentities -n {}', verify the key and run 'signal-cli -u {} trust -v \"FINGER_PRINT\" {}' to mark it as trusted",
m.getUsername(),
writer.println("Blocked numbers:");
final var blockedList = syncMessage.getBlockedList().get();
for (var address : blockedList.getAddresses()) {
- writer.println("- {}", address.getLegacyIdentifier());
+ writer.println("- {}", getLegacyIdentifier(address));
}
}
if (syncMessage.getVerified().isPresent()) {
final PlainTextWriter writer, final SignalServiceDataMessage.Quote quote
) {
writer.println("Id: {}", quote.getId());
- writer.println("Author: {}", m.resolveSignalServiceAddress(quote.getAuthor()).getLegacyIdentifier());
+ writer.println("Author: {}", getLegacyIdentifier(m.resolveSignalServiceAddress(quote.getAuthor())));
writer.println("Text: {}", quote.getText());
if (quote.getMentions() != null && quote.getMentions().size() > 0) {
writer.println("Mentions:");
}
private String formatContact(SignalServiceAddress address) {
- final var number = address.getLegacyIdentifier();
+ final var number = getLegacyIdentifier(address);
String name = null;
try {
name = m.getContactOrProfileName(number);
import org.asamk.signal.PlainTextWriterImpl;
import org.asamk.signal.manager.Manager;
+import static org.asamk.signal.util.Util.getLegacyIdentifier;
+
public class ListContactsCommand implements LocalCommand {
@Override
var contacts = m.getContacts();
for (var c : contacts) {
writer.println("Number: {} Name: {} Blocked: {}",
- m.resolveSignalServiceAddress(c.first()).getLegacyIdentifier(),
+ getLegacyIdentifier(m.resolveSignalServiceAddress(c.first())),
c.second().getName(),
c.second().isBlocked());
}
import org.asamk.signal.manager.Manager;
import org.asamk.signal.manager.storage.groups.GroupInfo;
import org.asamk.signal.manager.storage.recipients.RecipientId;
+import org.asamk.signal.util.Util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import java.util.ArrayList;
import java.util.Set;
private static Set<String> resolveMembers(Manager m, Set<RecipientId> addresses) {
return addresses.stream()
.map(m::resolveSignalServiceAddress)
- .map(SignalServiceAddress::getLegacyIdentifier)
+ .map(Util::getLegacyIdentifier)
.collect(Collectors.toSet());
}
import org.asamk.signal.manager.groups.NotAGroupMemberException;
import org.asamk.signal.manager.storage.identities.IdentityInfo;
import org.asamk.signal.util.ErrorUtils;
+import org.asamk.signal.util.Util;
import org.freedesktop.dbus.exceptions.DBusExecutionException;
import org.whispersystems.libsignal.util.Pair;
import org.whispersystems.libsignal.util.guava.Optional;
import org.whispersystems.signalservice.api.groupsv2.GroupLinkNotActiveException;
import org.whispersystems.signalservice.api.messages.SendMessageResult;
-import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.util.InvalidNumberException;
import java.io.File;
import java.util.stream.Collectors;
import java.util.stream.Stream;
+import static org.asamk.signal.util.Util.getLegacyIdentifier;
+
public class DbusSignalImpl implements Signal {
private final Manager m;
return group.getMembers()
.stream()
.map(m::resolveSignalServiceAddress)
- .map(SignalServiceAddress::getLegacyIdentifier)
+ .map(Util::getLegacyIdentifier)
.collect(Collectors.toList());
}
}
var contacts = m.getContacts();
for (var c : contacts) {
if (name.equals(c.second().getName())) {
- numbers.add(m.resolveSignalServiceAddress(c.first()).getLegacyIdentifier());
+ numbers.add(getLegacyIdentifier(m.resolveSignalServiceAddress(c.first())));
}
}
// Try profiles if no contact name was found
import com.fasterxml.jackson.annotation.JsonProperty;
import org.asamk.signal.manager.groups.GroupUtils;
+import org.asamk.signal.util.Util;
import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
import org.whispersystems.signalservice.api.messages.SignalServiceGroupV2;
-import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import java.util.Base64;
import java.util.List;
this.members = groupInfo.getMembers()
.get()
.stream()
- .map(SignalServiceAddress::getLegacyIdentifier)
+ .map(Util::getLegacyIdentifier)
.collect(Collectors.toList());
} else {
this.members = null;
import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
+import static org.asamk.signal.util.Util.getLegacyIdentifier;
+
public class JsonMention {
@JsonProperty
final int length;
JsonMention(SignalServiceDataMessage.Mention mention, Manager m) {
- this.name = m.resolveSignalServiceAddress(new SignalServiceAddress(mention.getUuid(), null))
- .getLegacyIdentifier();
+ this.name = getLegacyIdentifier(m.resolveSignalServiceAddress(new SignalServiceAddress(mention.getUuid(),
+ null)));
this.start = mention.getStart();
this.length = mention.getLength();
}
import java.util.List;
+import static org.asamk.signal.util.Util.getLegacyIdentifier;
+
public class JsonMessageEnvelope {
@JsonProperty
public JsonMessageEnvelope(SignalServiceEnvelope envelope, SignalServiceContent content, Manager m) {
if (!envelope.isUnidentifiedSender() && envelope.hasSource()) {
var source = envelope.getSourceAddress();
- this.source = source.getLegacyIdentifier();
+ this.source = getLegacyIdentifier(source);
this.sourceDevice = envelope.getSourceDevice();
this.relay = source.getRelay().orNull();
} else if (envelope.isUnidentifiedSender() && content != null) {
- this.source = content.getSender().getLegacyIdentifier();
+ this.source = getLegacyIdentifier(content.getSender());
this.sourceDevice = content.getSenderDevice();
this.relay = null;
} else {
import java.util.List;
import java.util.stream.Collectors;
+import static org.asamk.signal.util.Util.getLegacyIdentifier;
+
public class JsonQuote {
@JsonProperty
JsonQuote(SignalServiceDataMessage.Quote quote, Manager m) {
this.id = quote.getId();
- this.author = m.resolveSignalServiceAddress(quote.getAuthor()).getLegacyIdentifier();
+ this.author = getLegacyIdentifier(m.resolveSignalServiceAddress(quote.getAuthor()));
this.text = quote.getText();
if (quote.getMentions() != null && quote.getMentions().size() > 0) {
import org.asamk.signal.manager.Manager;
import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage.Reaction;
+import static org.asamk.signal.util.Util.getLegacyIdentifier;
+
public class JsonReaction {
@JsonProperty
JsonReaction(Reaction reaction, Manager m) {
this.emoji = reaction.getEmoji();
- this.targetAuthor = m.resolveSignalServiceAddress(reaction.getTargetAuthor()).getLegacyIdentifier();
+ this.targetAuthor = getLegacyIdentifier(m.resolveSignalServiceAddress(reaction.getTargetAuthor()));
this.targetSentTimestamp = reaction.getTargetSentTimestamp();
this.isRemove = reaction.isRemove();
}
import org.asamk.Signal;
import org.asamk.signal.manager.Manager;
+import org.asamk.signal.util.Util;
import org.whispersystems.signalservice.api.messages.multidevice.SentTranscriptMessage;
-import org.whispersystems.signalservice.api.push.SignalServiceAddress;
class JsonSyncDataMessage extends JsonDataMessage {
JsonSyncDataMessage(SentTranscriptMessage transcriptMessage, Manager m) {
super(transcriptMessage.getMessage(), m);
- this.destination = transcriptMessage.getDestination()
- .transform(SignalServiceAddress::getLegacyIdentifier)
- .orNull();
+ this.destination = transcriptMessage.getDestination().transform(Util::getLegacyIdentifier).orNull();
}
JsonSyncDataMessage(Signal.SyncMessageReceived messageReceived) {
import org.asamk.Signal;
import org.asamk.signal.manager.Manager;
+import org.asamk.signal.util.Util;
import org.whispersystems.signalservice.api.messages.multidevice.SignalServiceSyncMessage;
-import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import java.util.Base64;
import java.util.List;
import java.util.stream.Collectors;
+import static org.asamk.signal.util.Util.getLegacyIdentifier;
+
enum JsonSyncMessageType {
CONTACTS_SYNC,
GROUPS_SYNC,
.get()
.getAddresses()
.stream()
- .map(SignalServiceAddress::getLegacyIdentifier)
+ .map(Util::getLegacyIdentifier)
.collect(Collectors.toList());
this.blockedGroupIds = syncMessage.getBlockedList()
.get()
this.readMessages = syncMessage.getRead()
.get()
.stream()
- .map(message -> new JsonSyncReadMessage(message.getSender().getLegacyIdentifier(),
+ .map(message -> new JsonSyncReadMessage(getLegacyIdentifier(message.getSender()),
message.getTimestamp()))
.collect(Collectors.toList());
} else {
import java.util.List;
import java.util.stream.Collectors;
+import static org.asamk.signal.util.Util.getLegacyIdentifier;
+
public class ErrorUtils {
private final static Logger logger = LoggerFactory.getLogger(ErrorUtils.class);
}
public static String getErrorMessageFromSendMessageResult(SendMessageResult result) {
+ var identifier = getLegacyIdentifier(result.getAddress());
if (result.isNetworkFailure()) {
- return String.format("Network failure for \"%s\"", result.getAddress().getLegacyIdentifier());
+ return String.format("Network failure for \"%s\"", identifier);
} else if (result.isUnregisteredFailure()) {
- return String.format("Unregistered user \"%s\"", result.getAddress().getLegacyIdentifier());
+ return String.format("Unregistered user \"%s\"", identifier);
} else if (result.getIdentityFailure() != null) {
- return String.format("Untrusted Identity for \"%s\"", result.getAddress().getLegacyIdentifier());
+ return String.format("Untrusted Identity for \"%s\"", identifier);
} else if (result.getProofRequiredFailure() != null) {
final var failure = result.getProofRequiredFailure();
return String.format(
"CAPTCHA proof required for sending to \"%s\", available options \"%s\" with token \"%s\", or wait \"%d\" seconds",
- result.getAddress().getLegacyIdentifier(),
+ identifier,
failure.getOptions()
.stream()
.map(ProofRequiredException.Option::toString)
import org.asamk.signal.manager.groups.GroupId;
import org.asamk.signal.manager.groups.GroupIdFormatException;
import org.whispersystems.libsignal.util.guava.Optional;
+import org.whispersystems.signalservice.api.push.SignalServiceAddress;
public class Util {
public static GroupId decodeGroupId(String groupId) throws GroupIdFormatException {
return GroupId.fromBase64(groupId);
}
+
+ public static String getLegacyIdentifier(final SignalServiceAddress address) {
+ return address.getNumber().or(() -> address.getUuid().get().toString());
+ }
}