X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/4ab904b88e0b445c5e886fe91add69fb215dd455..701328b8c26d6ad4f98cf8213dd57e4b06aa1281:/src/main/java/org/asamk/signal/Main.java diff --git a/src/main/java/org/asamk/signal/Main.java b/src/main/java/org/asamk/signal/Main.java index 7f85f280..e534f05e 100644 --- a/src/main/java/org/asamk/signal/Main.java +++ b/src/main/java/org/asamk/signal/Main.java @@ -1,18 +1,18 @@ -/** - * Copyright (C) 2015 AsamK - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . +/* + Copyright (C) 2015-2018 AsamK + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ package org.asamk.signal; @@ -28,10 +28,15 @@ import net.sourceforge.argparse4j.impl.Arguments; import net.sourceforge.argparse4j.inf.*; import org.apache.http.util.TextUtils; import org.asamk.Signal; +import org.asamk.signal.manager.BaseConfig; +import org.asamk.signal.manager.Manager; import org.asamk.signal.storage.contacts.ContactInfo; import org.asamk.signal.storage.groups.GroupInfo; import org.asamk.signal.storage.protocol.JsonIdentityKeyStore; +import org.asamk.signal.util.DateUtils; import org.asamk.signal.util.Hex; +import org.asamk.signal.util.IOUtils; +import org.asamk.signal.util.Util; import org.freedesktop.dbus.DBusConnection; import org.freedesktop.dbus.DBusSigHandler; import org.freedesktop.dbus.exceptions.DBusException; @@ -52,15 +57,14 @@ import org.whispersystems.signalservice.internal.util.Base64; import java.io.File; import java.io.IOException; -import java.io.InputStream; -import java.io.StringWriter; import java.net.URI; import java.net.URISyntaxException; import java.nio.charset.Charset; import java.security.Security; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Map; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; @@ -69,8 +73,6 @@ public class Main { public static final String SIGNAL_BUSNAME = "org.asamk.Signal"; public static final String SIGNAL_OBJECTPATH = "/org/asamk/Signal"; - private static final TimeZone tzUTC = TimeZone.getTimeZone("UTC"); - public static void main(String[] args) { // Workaround for BKS truststore Security.insertProviderAt(new org.bouncycastle.jce.provider.BouncyCastleProvider(), 1); @@ -317,8 +319,8 @@ public class Main { for (DeviceInfo d : devices) { System.out.println("Device " + d.getId() + (d.getId() == m.getDeviceId() ? " (this device)" : "") + ":"); System.out.println(" Name: " + d.getName()); - System.out.println(" Created: " + formatTimestamp(d.getCreated())); - System.out.println(" Last seen: " + formatTimestamp(d.getLastSeen())); + System.out.println(" Created: " + DateUtils.formatTimestamp(d.getCreated())); + System.out.println(" Last seen: " + DateUtils.formatTimestamp(d.getLastSeen())); } } catch (IOException e) { e.printStackTrace(); @@ -373,7 +375,7 @@ public class Main { String messageText = ns.getString("message"); if (messageText == null) { try { - messageText = readAll(System.in); + messageText = IOUtils.readAll(System.in, Charset.defaultCharset()); } catch (IOException e) { System.err.println("Failed to read message from stdin: " + e.getMessage()); System.err.println("Aborting sending."); @@ -425,7 +427,7 @@ public class Main { @Override public void handle(Signal.MessageReceived s) { System.out.print(String.format("Envelope from: %s\nTimestamp: %s\nBody: %s\n", - s.getSender(), formatTimestamp(s.getTimestamp()), s.getMessage())); + s.getSender(), DateUtils.formatTimestamp(s.getTimestamp()), s.getMessage())); if (s.getGroupId().length > 0) { System.out.println("Group info:"); System.out.println(" Id: " + Base64.encodeBytes(s.getGroupId())); @@ -443,7 +445,7 @@ public class Main { @Override public void handle(Signal.ReceiptReceived s) { System.out.print(String.format("Receipt from: %s\nTimestamp: %s\n", - s.getSender(), formatTimestamp(s.getTimestamp()))); + s.getSender(), DateUtils.formatTimestamp(s.getTimestamp()))); } }); } catch (UnsatisfiedLinkError e) { @@ -708,7 +710,7 @@ public class Main { } private static void printIdentityFingerprint(Manager m, String theirUsername, JsonIdentityKeyStore.Identity theirId) { - String digits = formatSafetyNumber(m.computeSafetyNumber(theirUsername, theirId.getIdentityKey())); + String digits = Util.formatSafetyNumber(m.computeSafetyNumber(theirUsername, theirId.getIdentityKey())); System.out.println(String.format("%s: %s Added: %s Fingerprint: %s Safety Number: %s", theirUsername, theirId.getTrustLevel(), theirId.getDateAdded(), Hex.toStringCondensed(theirId.getFingerprint()), digits)); } @@ -723,16 +725,6 @@ public class Main { } } - private static String formatSafetyNumber(String digits) { - final int partCount = 12; - int partSize = digits.length() / partCount; - StringBuilder f = new StringBuilder(digits.length() + partCount); - for (int i = 0; i < partCount; i++) { - f.append(digits.substring(i * partSize, (i * partSize) + partSize)).append(" "); - } - return f.toString(); - } - private static void handleGroupNotFoundException(GroupNotFoundException e) { System.err.println("Failed to send to group: " + e.getMessage()); System.err.println("Aborting sending."); @@ -766,7 +758,7 @@ public class Main { .build() .defaultHelp(true) .description("Commandline interface for Signal.") - .version(Manager.PROJECT_NAME + " " + Manager.PROJECT_VERSION); + .version(BaseConfig.PROJECT_NAME + " " + BaseConfig.PROJECT_VERSION); parser.addArgument("-v", "--version") .help("Show package version.") @@ -956,18 +948,6 @@ public class Main { System.err.println("Failed to send message: " + e.getMessage()); } - private static String readAll(InputStream in) throws IOException { - StringWriter output = new StringWriter(); - byte[] buffer = new byte[4096]; - long count = 0; - int n; - while (-1 != (n = System.in.read(buffer))) { - output.write(new String(buffer, 0, n, Charset.defaultCharset())); - count += n; - } - return output.toString(); - } - private static class ReceiveMessageHandler implements Manager.ReceiveMessageHandler { final Manager m; @@ -983,7 +963,7 @@ public class Main { if (source.getRelay().isPresent()) { System.out.println("Relayed by: " + source.getRelay().get()); } - System.out.println("Timestamp: " + formatTimestamp(envelope.getTimestamp())); + System.out.println("Timestamp: " + DateUtils.formatTimestamp(envelope.getTimestamp())); if (envelope.isUnidentifiedSender()) { System.out.println("Sent by unidentified/sealed sender"); } @@ -1029,7 +1009,7 @@ public class Main { System.out.println("Received sync read messages list"); for (ReadMessage rm : syncMessage.getRead().get()) { ContactInfo fromContact = m.getContact(rm.getSender()); - System.out.println("From: " + (fromContact == null ? "" : "“" + fromContact.name + "” ") + rm.getSender() + " Message timestamp: " + formatTimestamp(rm.getTimestamp())); + System.out.println("From: " + (fromContact == null ? "" : "“" + fromContact.name + "” ") + rm.getSender() + " Message timestamp: " + DateUtils.formatTimestamp(rm.getTimestamp())); } } if (syncMessage.getRequest().isPresent()) { @@ -1052,9 +1032,9 @@ public class Main { } else { to = "Unknown"; } - System.out.println("To: " + to + " , Message timestamp: " + formatTimestamp(sentTranscriptMessage.getTimestamp())); + System.out.println("To: " + to + " , Message timestamp: " + DateUtils.formatTimestamp(sentTranscriptMessage.getTimestamp())); if (sentTranscriptMessage.getExpirationStartTimestamp() > 0) { - System.out.println("Expiration started at: " + formatTimestamp(sentTranscriptMessage.getExpirationStartTimestamp())); + System.out.println("Expiration started at: " + DateUtils.formatTimestamp(sentTranscriptMessage.getExpirationStartTimestamp())); } SignalServiceDataMessage message = sentTranscriptMessage.getMessage(); handleSignalServiceDataMessage(message); @@ -1071,7 +1051,7 @@ public class Main { System.out.println("Received sync message with verified identities:"); final VerifiedMessage verifiedMessage = syncMessage.getVerified().get(); System.out.println(" - " + verifiedMessage.getDestination() + ": " + verifiedMessage.getVerified()); - String safetyNumber = formatSafetyNumber(m.computeSafetyNumber(verifiedMessage.getDestination(), verifiedMessage.getIdentityKey())); + String safetyNumber = Util.formatSafetyNumber(m.computeSafetyNumber(verifiedMessage.getDestination(), verifiedMessage.getIdentityKey())); System.out.println(" " + safetyNumber); } if (syncMessage.getConfiguration().isPresent()) { @@ -1111,7 +1091,7 @@ public class Main { if (content.getReceiptMessage().isPresent()) { System.out.println("Received a receipt message"); SignalServiceReceiptMessage receiptMessage = content.getReceiptMessage().get(); - System.out.println(" - When: " + formatTimestamp(receiptMessage.getWhen())); + System.out.println(" - When: " + DateUtils.formatTimestamp(receiptMessage.getWhen())); if (receiptMessage.isDeliveryReceipt()) { System.out.println(" - Is delivery receipt"); } @@ -1120,14 +1100,14 @@ public class Main { } System.out.println(" - Timestamps:"); for (long timestamp : receiptMessage.getTimestamps()) { - System.out.println(" " + formatTimestamp(timestamp)); + System.out.println(" " + DateUtils.formatTimestamp(timestamp)); } } if (content.getTypingMessage().isPresent()) { System.out.println("Received a typing message"); SignalServiceTypingMessage typingMessage = content.getTypingMessage().get(); System.out.println(" - Action: " + typingMessage.getAction()); - System.out.println(" - Timestamp: " + formatTimestamp(typingMessage.getTimestamp())); + System.out.println(" - Timestamp: " + DateUtils.formatTimestamp(typingMessage.getTimestamp())); if (typingMessage.getGroupId().isPresent()) { GroupInfo group = m.getGroup(typingMessage.getGroupId().get()); if (group != null) { @@ -1145,7 +1125,7 @@ public class Main { } private void handleSignalServiceDataMessage(SignalServiceDataMessage message) { - System.out.println("Message timestamp: " + formatTimestamp(message.getTimestamp())); + System.out.println("Message timestamp: " + DateUtils.formatTimestamp(message.getTimestamp())); if (message.getBody().isPresent()) { System.out.println("Body: " + message.getBody().get()); @@ -1334,11 +1314,4 @@ public class Main { } } } - - private static String formatTimestamp(long timestamp) { - Date date = new Date(timestamp); - final DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"); // Quoted "Z" to indicate UTC, no timezone offset - df.setTimeZone(tzUTC); - return timestamp + " (" + df.format(date) + ")"; - } }