]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/org/asamk/signal/Main.java
Support registration lock PIN
[signal-cli] / src / main / java / org / asamk / signal / Main.java
index 69a46193c11e9df2c6b285e8befe1976e7ab37cf..5968904937c23484a4c47853ff8e015245c6a344 100644 (file)
@@ -37,14 +37,17 @@ import org.freedesktop.dbus.DBusSigHandler;
 import org.freedesktop.dbus.exceptions.DBusException;
 import org.freedesktop.dbus.exceptions.DBusExecutionException;
 import org.whispersystems.libsignal.InvalidKeyException;
+import org.whispersystems.libsignal.util.guava.Optional;
 import org.whispersystems.signalservice.api.crypto.UntrustedIdentityException;
 import org.whispersystems.signalservice.api.messages.*;
+import org.whispersystems.signalservice.api.messages.calls.*;
 import org.whispersystems.signalservice.api.messages.multidevice.*;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
 import org.whispersystems.signalservice.api.push.exceptions.EncapsulatedExceptions;
 import org.whispersystems.signalservice.api.push.exceptions.NetworkFailureException;
 import org.whispersystems.signalservice.api.push.exceptions.UnregisteredUserException;
 import org.whispersystems.signalservice.api.util.PhoneNumberFormatter;
+import org.whispersystems.signalservice.internal.push.LockedException;
 import org.whispersystems.signalservice.internal.util.Base64;
 
 import java.io.File;
@@ -182,6 +185,39 @@ public class Main {
                         return 3;
                     }
                     break;
+                case "setPin":
+                    if (dBusConn != null) {
+                        System.err.println("setPin is not yet implemented via dbus");
+                        return 1;
+                    }
+                    if (!m.isRegistered()) {
+                        System.err.println("User is not registered.");
+                        return 1;
+                    }
+                    try {
+                        String registrationLockPin = ns.getString("registrationLockPin");
+                        m.setRegistrationLockPin(Optional.of(registrationLockPin));
+                    } catch (IOException e) {
+                        System.err.println("Set pin error: " + e.getMessage());
+                        return 3;
+                    }
+                    break;
+                case "removePin":
+                    if (dBusConn != null) {
+                        System.err.println("removePin is not yet implemented via dbus");
+                        return 1;
+                    }
+                    if (!m.isRegistered()) {
+                        System.err.println("User is not registered.");
+                        return 1;
+                    }
+                    try {
+                        m.setRegistrationLockPin(Optional.<String>absent());
+                    } catch (IOException e) {
+                        System.err.println("Remove pin error: " + e.getMessage());
+                        return 3;
+                    }
+                    break;
                 case "verify":
                     if (dBusConn != null) {
                         System.err.println("verify is not yet implemented via dbus");
@@ -196,7 +232,13 @@ public class Main {
                         return 1;
                     }
                     try {
-                        m.verifyAccount(ns.getString("verificationCode"));
+                        String verificationCode = ns.getString("verificationCode");
+                        String pin = ns.getString("pin");
+                        m.verifyAccount(verificationCode, pin);
+                    } catch (LockedException e) {
+                        System.err.println("Verification failed! This number is locked with a pin. Hours remaining until reset: " + (e.getTimeRemaining() / 1000 / 60 / 60));
+                        System.err.println("Use '--pin PIN_CODE' to specify the registration lock PIN");
+                        return 3;
                     } catch (IOException e) {
                         System.err.println("Verify error: " + e.getMessage());
                         return 3;
@@ -776,9 +818,17 @@ public class Main {
         Subparser parserUpdateAccount = subparsers.addParser("updateAccount");
         parserUpdateAccount.help("Update the account attributes on the signal server.");
 
+        Subparser parserSetPin = subparsers.addParser("setPin");
+        parserSetPin.addArgument("registrationLockPin")
+                .help("The registration lock PIN, that will be required for new registrations (resets after 7 days of inactivity)");
+
+        Subparser parserRemovePin = subparsers.addParser("removePin");
+
         Subparser parserVerify = subparsers.addParser("verify");
         parserVerify.addArgument("verificationCode")
                 .help("The verification code you received via sms or voice call.");
+        parserVerify.addArgument("-p", "--pin")
+                .help("The registration lock PIN, that was set by the user (Optional)");
 
         Subparser parserSend = subparsers.addParser("send");
         parserSend.addArgument("-g", "--group")
@@ -1018,6 +1068,54 @@ public class Main {
                             String safetyNumber = formatSafetyNumber(m.computeSafetyNumber(verifiedMessage.getDestination(), verifiedMessage.getIdentityKey()));
                             System.out.println("   " + safetyNumber);
                         }
+                        if (syncMessage.getConfiguration().isPresent()) {
+                            System.out.println("Received sync message with configuration:");
+                            final ConfigurationMessage configurationMessage = syncMessage.getConfiguration().get();
+                            if (configurationMessage.getReadReceipts().isPresent()) {
+                                System.out.println(" - Read receipts: " + (configurationMessage.getReadReceipts().get() ? "enabled" : "disabled"));
+                            }
+                        }
+                    }
+                    if (content.getCallMessage().isPresent()) {
+                        System.out.println("Received a call message");
+                        SignalServiceCallMessage callMessage = content.getCallMessage().get();
+                        if (callMessage.getAnswerMessage().isPresent()) {
+                            AnswerMessage answerMessage = callMessage.getAnswerMessage().get();
+                            System.out.println("Answer message: " + answerMessage.getId() + ": " + answerMessage.getDescription());
+                        }
+                        if (callMessage.getBusyMessage().isPresent()) {
+                            BusyMessage busyMessage = callMessage.getBusyMessage().get();
+                            System.out.println("Busy message: " + busyMessage.getId());
+                        }
+                        if (callMessage.getHangupMessage().isPresent()) {
+                            HangupMessage hangupMessage = callMessage.getHangupMessage().get();
+                            System.out.println("Hangup message: " + hangupMessage.getId());
+                        }
+                        if (callMessage.getIceUpdateMessages().isPresent()) {
+                            List<IceUpdateMessage> iceUpdateMessages = callMessage.getIceUpdateMessages().get();
+                            for (IceUpdateMessage iceUpdateMessage : iceUpdateMessages) {
+                                System.out.println("Ice update message: " + iceUpdateMessage.getId() + ", sdp: " + iceUpdateMessage.getSdp());
+                            }
+                        }
+                        if (callMessage.getOfferMessage().isPresent()) {
+                            OfferMessage offerMessage = callMessage.getOfferMessage().get();
+                            System.out.println("Offer message: " + offerMessage.getId() + ": " + offerMessage.getDescription());
+                        }
+                    }
+                    if (content.getReceiptMessage().isPresent()) {
+                        System.out.println("Received a receipt message");
+                        SignalServiceReceiptMessage receiptMessage = content.getReceiptMessage().get();
+                        System.out.println(" - When: " + formatTimestamp(receiptMessage.getWhen()));
+                        if (receiptMessage.isDeliveryReceipt()) {
+                            System.out.println(" - Is delivery receipt");
+                        }
+                        if (receiptMessage.isReadReceipt()) {
+                            System.out.println(" - Is read receipt");
+                        }
+                        System.out.println(" - Timestamps:");
+                        for (long timestamp : receiptMessage.getTimestamps()) {
+                            System.out.println("    " + formatTimestamp(timestamp));
+                        }
                     }
                 }
             } else {
@@ -1066,6 +1164,9 @@ public class Main {
             if (message.getExpiresInSeconds() > 0) {
                 System.out.println("Expires in: " + message.getExpiresInSeconds() + " seconds");
             }
+            if (message.isProfileKeyUpdate() && message.getProfileKey().isPresent()) {
+                System.out.println("Profile key update, key length:" + message.getProfileKey().get().length);
+            }
 
             if (message.getAttachments().isPresent()) {
                 System.out.println("Attachments: ");
@@ -1083,6 +1184,7 @@ public class Main {
                 System.out.println("  Filename: " + (pointer.getFileName().isPresent() ? pointer.getFileName().get() : "-"));
                 System.out.println("  Size: " + (pointer.getSize().isPresent() ? pointer.getSize().get() + " bytes" : "<unavailable>") + (pointer.getPreview().isPresent() ? " (Preview is available: " + pointer.getPreview().get().length + " bytes)" : ""));
                 System.out.println("  Voice note: " + (pointer.getVoiceNote() ? "yes" : "no"));
+                System.out.println("  Dimensions: " + pointer.getWidth() + "x" + pointer.getHeight());
                 File file = m.getAttachmentFile(pointer.getId());
                 if (file.exists()) {
                     System.out.println("  Stored plaintext in: " + file);