import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentStream;
import org.whispersystems.signalservice.api.messages.SignalServiceEnvelope;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
-import org.whispersystems.signalservice.api.util.InvalidNumberException;
-import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
import org.whispersystems.signalservice.api.util.StreamDetails;
-import org.whispersystems.signalservice.internal.util.Base64;
+import org.whispersystems.signalservice.api.util.UuidUtil;
+import org.whispersystems.signalservice.internal.push.http.ResumableUploadSpec;
+import org.whispersystems.util.Base64;
import java.io.BufferedInputStream;
import java.io.DataInputStream;
import java.net.URLEncoder;
import java.nio.file.Files;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.HashMap;
-import java.util.HashSet;
import java.util.List;
import java.util.Map;
-import java.util.Set;
+import java.util.UUID;
import static org.whispersystems.signalservice.internal.util.Util.isEmpty;
class Utils {
static List<SignalServiceAttachment> getSignalServiceAttachments(List<String> attachments) throws AttachmentInvalidException {
- List<SignalServiceAttachment> SignalServiceAttachments = null;
+ List<SignalServiceAttachment> signalServiceAttachments = null;
if (attachments != null) {
- SignalServiceAttachments = new ArrayList<>(attachments.size());
+ signalServiceAttachments = new ArrayList<>(attachments.size());
for (String attachment : attachments) {
try {
- SignalServiceAttachments.add(createAttachment(new File(attachment)));
+ signalServiceAttachments.add(createAttachment(new File(attachment)));
} catch (IOException e) {
throw new AttachmentInvalidException(attachment, e);
}
}
}
- return SignalServiceAttachments;
+ return signalServiceAttachments;
}
private static String getFileMimeType(File file) throws IOException {
final long attachmentSize = attachmentFile.length();
final String mime = getFileMimeType(attachmentFile);
// TODO mabybe add a parameter to set the voiceNote, preview, width, height and caption option
+ final long uploadTimestamp = System.currentTimeMillis();
Optional<byte[]> preview = Optional.absent();
Optional<String> caption = Optional.absent();
Optional<String> blurHash = Optional.absent();
- return new SignalServiceAttachmentStream(attachmentStream, mime, attachmentSize, Optional.of(attachmentFile.getName()), false, preview, 0, 0, caption, blurHash, null);
+ final Optional<ResumableUploadSpec> resumableUploadSpec = Optional.absent();
+ return new SignalServiceAttachmentStream(attachmentStream, mime, attachmentSize, Optional.of(attachmentFile.getName()), false, preview, 0, 0, uploadTimestamp, caption, blurHash, null, null, resumableUploadSpec);
}
static StreamDetails createStreamDetailsFromFile(File file) throws IOException {
return new DeviceLinkInfo(deviceIdentifier, deviceKey);
}
- static Set<SignalServiceAddress> getSignalServiceAddresses(Collection<String> recipients, String localNumber) {
- Set<SignalServiceAddress> recipientsTS = new HashSet<>(recipients.size());
- for (String recipient : recipients) {
- try {
- recipientsTS.add(getPushAddress(recipient, localNumber));
- } catch (InvalidNumberException e) {
- System.err.println("Failed to add recipient \"" + recipient + "\": " + e.getMessage());
- System.err.println("Aborting sending.");
- return null;
- }
- }
- return recipientsTS;
- }
-
- static String canonicalizeNumber(String number, String localNumber) throws InvalidNumberException {
- return PhoneNumberFormatter.formatNumber(number, localNumber);
- }
-
- private static SignalServiceAddress getPushAddress(String number, String localNumber) throws InvalidNumberException {
- String e164number = canonicalizeNumber(number, localNumber);
- return new SignalServiceAddress(e164number);
- }
-
static SignalServiceEnvelope loadEnvelope(File file) throws IOException {
try (FileInputStream f = new FileInputStream(file)) {
DataInputStream in = new DataInputStream(f);
int version = in.readInt();
- if (version > 2) {
+ if (version > 3) {
return null;
}
int type = in.readInt();
String source = in.readUTF();
+ UUID sourceUuid = null;
+ if (version >= 3) {
+ sourceUuid = UuidUtil.parseOrNull(in.readUTF());
+ }
int sourceDevice = in.readInt();
if (version == 1) {
// read legacy relay field
uuid = null;
}
}
- return new SignalServiceEnvelope(type, source, sourceDevice, timestamp, legacyMessage, content, serverTimestamp, uuid);
+ Optional<SignalServiceAddress> addressOptional = sourceUuid == null && source.isEmpty()
+ ? Optional.absent()
+ : Optional.of(new SignalServiceAddress(sourceUuid, source));
+ return new SignalServiceEnvelope(type, addressOptional, sourceDevice, timestamp, legacyMessage, content, serverTimestamp, uuid);
}
}
static void storeEnvelope(SignalServiceEnvelope envelope, File file) throws IOException {
try (FileOutputStream f = new FileOutputStream(file)) {
try (DataOutputStream out = new DataOutputStream(f)) {
- out.writeInt(2); // version
+ out.writeInt(3); // version
out.writeInt(envelope.getType());
- out.writeUTF(envelope.getSource());
+ out.writeUTF(envelope.getSourceE164().isPresent() ? envelope.getSourceE164().get() : "");
+ out.writeUTF(envelope.getSourceUuid().isPresent() ? envelope.getSourceUuid().get() : "");
out.writeInt(envelope.getSourceDevice());
out.writeLong(envelope.getTimestamp());
if (envelope.hasContent()) {
return outputFile;
}
- static String computeSafetyNumber(String ownUsername, IdentityKey ownIdentityKey, String theirUsername, IdentityKey theirIdentityKey) {
- Fingerprint fingerprint = new NumericFingerprintGenerator(5200).createFor(ownUsername, ownIdentityKey, theirUsername, theirIdentityKey);
+ static String computeSafetyNumber(SignalServiceAddress ownAddress, IdentityKey ownIdentityKey, SignalServiceAddress theirAddress, IdentityKey theirIdentityKey) {
+ int version;
+ byte[] ownId;
+ byte[] theirId;
+
+ if (BaseConfig.capabilities.isUuid()
+ && ownAddress.getUuid().isPresent() && theirAddress.getUuid().isPresent()) {
+ // Version 2: UUID user
+ version = 2;
+ ownId = UuidUtil.toByteArray(ownAddress.getUuid().get());
+ theirId = UuidUtil.toByteArray(theirAddress.getUuid().get());
+ } else {
+ // Version 1: E164 user
+ version = 1;
+ if (!ownAddress.getNumber().isPresent() || !theirAddress.getNumber().isPresent()) {
+ return "INVALID ID";
+ }
+ ownId = ownAddress.getNumber().get().getBytes();
+ theirId = theirAddress.getNumber().get().getBytes();
+ }
+
+ Fingerprint fingerprint = new NumericFingerprintGenerator(5200).createFor(version, ownId, ownIdentityKey, theirId, theirIdentityKey);
return fingerprint.getDisplayableFingerprint().getDisplayText();
}