]> nmode's Git Repositories - signal-cli/blobdiff - src/main/java/cli/Manager.java
Reformat javadoc
[signal-cli] / src / main / java / cli / Manager.java
index 97070c97a2be5aace51a9d6494a7bb20e13dc6dd..177cae789d3848a1349f3cec64e342ad5ba1500e 100644 (file)
@@ -1,16 +1,16 @@
 /**
  * Copyright (C) 2015 AsamK
- * <p>
+ *
  * 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.
- * <p>
+ *
  * 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.
- * <p>
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
@@ -24,18 +24,21 @@ import org.whispersystems.libaxolotl.InvalidVersionException;
 import org.whispersystems.libaxolotl.state.PreKeyRecord;
 import org.whispersystems.libaxolotl.state.SignedPreKeyRecord;
 import org.whispersystems.libaxolotl.util.KeyHelper;
+import org.whispersystems.libaxolotl.util.Medium;
 import org.whispersystems.libaxolotl.util.guava.Optional;
 import org.whispersystems.textsecure.api.TextSecureAccountManager;
 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.TextSecureContent;
 import org.whispersystems.textsecure.api.messages.TextSecureEnvelope;
-import org.whispersystems.textsecure.api.messages.TextSecureMessage;
+import org.whispersystems.textsecure.api.push.TextSecureAddress;
 import org.whispersystems.textsecure.api.push.TrustStore;
+import org.whispersystems.textsecure.api.util.InvalidNumberException;
+import org.whispersystems.textsecure.api.util.PhoneNumberFormatter;
 
 import java.io.*;
-import java.nio.file.Path;
 import java.util.List;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
@@ -81,7 +84,9 @@ public class Manager {
         JSONObject in = new JSONObject(IOUtils.toString(new FileInputStream(getFileName())));
         username = in.getString("username");
         password = in.getString("password");
-        signalingKey = in.getString("signalingKey");
+        if (in.has("signalingKey")) {
+            signalingKey = in.getString("signalingKey");
+        }
         axolotlStore = new JsonAxolotlStore(in.getJSONObject("axolotlStore"));
         registered = in.getBoolean("registered");
         accountManager = new TextSecureAccountManager(URL, TRUST_STORE, username, password);
@@ -115,12 +120,16 @@ public class Manager {
         return registered;
     }
 
-    public void register() throws IOException {
+    public void register(boolean voiceVerication) throws IOException {
         password = Util.getSecret(18);
 
         accountManager = new TextSecureAccountManager(URL, TRUST_STORE, username, password);
 
-        accountManager.requestSmsVerificationCode();
+        if (voiceVerication)
+            accountManager.requestVoiceVerificationCode();
+        else
+            accountManager.requestSmsVerificationCode();
+
         registered = false;
     }
 
@@ -131,13 +140,21 @@ public class Manager {
 
         //accountManager.setGcmId(Optional.of(GoogleCloudMessaging.getInstance(this).register(REGISTRATION_ID)));
         registered = true;
+
         int start = 0;
         List<PreKeyRecord> oneTimePreKeys = KeyHelper.generatePreKeys(start, 100);
+        for (int i = start; i < oneTimePreKeys.size(); i++) {
+            axolotlStore.storePreKey(i, oneTimePreKeys.get(i));
+        }
+
         PreKeyRecord lastResortKey = KeyHelper.generateLastResortPreKey();
+        axolotlStore.storePreKey(Medium.MAX_VALUE, lastResortKey);
+
         int signedPreKeyId = 0;
         SignedPreKeyRecord signedPreKeyRecord;
         try {
             signedPreKeyRecord = KeyHelper.generateSignedPreKey(axolotlStore.getIdentityKeyPair(), signedPreKeyId);
+            axolotlStore.storeSignedPreKey(signedPreKeyId, signedPreKeyRecord);
         } catch (InvalidKeyException e) {
             // Should really not happen
             System.out.println("invalid key");
@@ -151,31 +168,56 @@ public class Manager {
                 axolotlStore, Optional.<TextSecureMessageSender.EventListener>absent());
     }
 
-    public TextSecureMessage receiveMessage() throws IOException, InvalidVersionException {
+    public TextSecureContent decryptMessage(TextSecureEnvelope envelope) {
+        TextSecureCipher cipher = new TextSecureCipher(new TextSecureAddress(username), axolotlStore);
+        try {
+            return cipher.decrypt(envelope);
+        } catch (Exception e) {
+            // TODO handle all exceptions
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    public void handleEndSession(String source) {
+        axolotlStore.deleteAllSessions(source);
+    }
+
+    public interface ReceiveMessageHandler {
+        void handleMessage(TextSecureEnvelope envelope);
+    }
+
+    public void receiveMessages(ReceiveMessageHandler handler) throws IOException {
         TextSecureMessageReceiver messageReceiver = new TextSecureMessageReceiver(URL, TRUST_STORE, username, password, signalingKey);
         TextSecureMessagePipe messagePipe = null;
 
         try {
             messagePipe = messageReceiver.createMessagePipe();
 
-            TextSecureEnvelope envelope;
-            try {
-                envelope = messagePipe.read(5, TimeUnit.SECONDS);
-            } catch (TimeoutException e) {
-                return null;
+            while (true) {
+                TextSecureEnvelope envelope;
+                try {
+                    envelope = messagePipe.read(1, TimeUnit.MINUTES);
+                    handler.handleMessage(envelope);
+                } catch (TimeoutException e) {
+                } catch (InvalidVersionException e) {
+                    System.out.println("Ignoring error: " + e.getMessage());
+                }
+                save();
             }
-            TextSecureCipher cipher = new TextSecureCipher(axolotlStore);
-            TextSecureMessage message = null;
-            try {
-                message = cipher.decrypt(envelope);
-            } catch (Exception e) {
-                // TODO handle all exceptions
-                e.printStackTrace();
-            }
-            return message;
         } finally {
             if (messagePipe != null)
                 messagePipe.shutdown();
         }
     }
+
+    public String canonicalizeNumber(String number) throws InvalidNumberException {
+        String localNumber = username;
+        return PhoneNumberFormatter.formatNumber(number, localNumber);
+    }
+
+    protected TextSecureAddress getPushAddress(String number) throws InvalidNumberException {
+        String e164number = canonicalizeNumber(number);
+        return new TextSecureAddress(e164number);
+    }
 }