mirror of
https://github.com/AsamK/signal-cli
synced 2025-08-29 02:20:39 +00:00
Implement downloading attachments
This commit is contained in:
parent
f06672db89
commit
e1b584ab84
2 changed files with 43 additions and 8 deletions
|
@ -20,6 +20,7 @@ import net.sourceforge.argparse4j.ArgumentParsers;
|
|||
import net.sourceforge.argparse4j.impl.Arguments;
|
||||
import net.sourceforge.argparse4j.inf.*;
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.whispersystems.libaxolotl.InvalidMessageException;
|
||||
import org.whispersystems.textsecure.api.crypto.UntrustedIdentityException;
|
||||
import org.whispersystems.textsecure.api.messages.*;
|
||||
import org.whispersystems.textsecure.api.messages.multidevice.TextSecureSyncMessage;
|
||||
|
@ -262,6 +263,12 @@ public class Main {
|
|||
System.out.println("- " + attachment.getContentType() + " (" + (attachment.isPointer() ? "Pointer" : "") + (attachment.isStream() ? "Stream" : "") + ")");
|
||||
if (attachment.isPointer()) {
|
||||
System.out.println(" Id: " + attachment.asPointer().getId() + " Key length: " + attachment.asPointer().getKey().length + (attachment.asPointer().getRelay().isPresent() ? " Relay: " + attachment.asPointer().getRelay().get() : ""));
|
||||
try {
|
||||
File file = m.retrieveAttachment(attachment.asPointer());
|
||||
System.out.println(" Stored plaintext in: " + file);
|
||||
} catch (IOException | InvalidMessageException e) {
|
||||
System.out.println("Failed to retrieve attachment: " + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,10 +18,7 @@ package cli;
|
|||
|
||||
import org.apache.commons.io.IOUtils;
|
||||
import org.json.JSONObject;
|
||||
import org.whispersystems.libaxolotl.IdentityKeyPair;
|
||||
import org.whispersystems.libaxolotl.InvalidKeyException;
|
||||
import org.whispersystems.libaxolotl.InvalidKeyIdException;
|
||||
import org.whispersystems.libaxolotl.InvalidVersionException;
|
||||
import org.whispersystems.libaxolotl.*;
|
||||
import org.whispersystems.libaxolotl.ecc.Curve;
|
||||
import org.whispersystems.libaxolotl.ecc.ECKeyPair;
|
||||
import org.whispersystems.libaxolotl.state.PreKeyRecord;
|
||||
|
@ -34,6 +31,7 @@ import org.whispersystems.textsecure.api.TextSecureMessagePipe;
|
|||
import org.whispersystems.textsecure.api.TextSecureMessageReceiver;
|
||||
import org.whispersystems.textsecure.api.TextSecureMessageSender;
|
||||
import org.whispersystems.textsecure.api.crypto.TextSecureCipher;
|
||||
import org.whispersystems.textsecure.api.messages.TextSecureAttachmentPointer;
|
||||
import org.whispersystems.textsecure.api.messages.TextSecureContent;
|
||||
import org.whispersystems.textsecure.api.messages.TextSecureDataMessage;
|
||||
import org.whispersystems.textsecure.api.messages.TextSecureEnvelope;
|
||||
|
@ -54,6 +52,8 @@ public class Manager {
|
|||
private final static TrustStore TRUST_STORE = new WhisperTrustStore();
|
||||
|
||||
private final static String settingsPath = System.getProperty("user.home") + "/.config/textsecure";
|
||||
private final static String dataPath = settingsPath + "/data";
|
||||
private final static String attachmentsPath = settingsPath + "/attachments";
|
||||
|
||||
private String username;
|
||||
private String password;
|
||||
|
@ -71,9 +71,8 @@ public class Manager {
|
|||
}
|
||||
|
||||
public String getFileName() {
|
||||
String path = settingsPath + "/data";
|
||||
new File(path).mkdirs();
|
||||
return path + "/" + username;
|
||||
new File(dataPath).mkdirs();
|
||||
return dataPath + "/" + username;
|
||||
}
|
||||
|
||||
public boolean userExists() {
|
||||
|
@ -247,7 +246,7 @@ public class Manager {
|
|||
}
|
||||
|
||||
public void receiveMessages(int timeoutSeconds, boolean returnOnTimeout, ReceiveMessageHandler handler) throws IOException {
|
||||
TextSecureMessageReceiver messageReceiver = new TextSecureMessageReceiver(URL, TRUST_STORE, username, password, signalingKey);
|
||||
final TextSecureMessageReceiver messageReceiver = new TextSecureMessageReceiver(URL, TRUST_STORE, username, password, signalingKey);
|
||||
TextSecureMessagePipe messagePipe = null;
|
||||
|
||||
try {
|
||||
|
@ -272,6 +271,35 @@ public class Manager {
|
|||
}
|
||||
}
|
||||
|
||||
public File retrieveAttachment(TextSecureAttachmentPointer pointer) throws IOException, InvalidMessageException {
|
||||
final TextSecureMessageReceiver messageReceiver = new TextSecureMessageReceiver(URL, TRUST_STORE, username, password, signalingKey);
|
||||
|
||||
File tmpFile = File.createTempFile("ts_attach_" + pointer.getId(), ".tmp");
|
||||
InputStream input = messageReceiver.retrieveAttachment(pointer, tmpFile);
|
||||
|
||||
new File(attachmentsPath).mkdirs();
|
||||
File outputFile = new File(attachmentsPath + "/" + pointer.getId());
|
||||
OutputStream output = null;
|
||||
try {
|
||||
output = new FileOutputStream(outputFile);
|
||||
byte[] buffer = new byte[4096];
|
||||
int read;
|
||||
|
||||
while ((read = input.read(buffer)) != -1) {
|
||||
output.write(buffer, 0, read);
|
||||
}
|
||||
} catch (FileNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
return null;
|
||||
} finally {
|
||||
if (output != null) {
|
||||
output.close();
|
||||
}
|
||||
tmpFile.delete();
|
||||
}
|
||||
return outputFile;
|
||||
}
|
||||
|
||||
public String canonicalizeNumber(String number) throws InvalidNumberException {
|
||||
String localNumber = username;
|
||||
return PhoneNumberFormatter.formatNumber(number, localNumber);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue