]> nmode's Git Repositories - signal-cli/commitdiff
Refresh prekeys if there are less than 20 left on the server
authorAsamK <asamk@gmx.de>
Sun, 27 Mar 2016 14:15:49 +0000 (16:15 +0200)
committerAsamK <asamk@gmx.de>
Sun, 27 Mar 2016 14:17:42 +0000 (16:17 +0200)
src/main/java/org/asamk/signal/Manager.java

index 94bb555af37c0b8e191a9b0b6dfdf6ec181e41e3..a4a9c37a4bd5f1fceea8f8d07ca7cc0e3a242f60 100644 (file)
@@ -60,6 +60,9 @@ class Manager implements Signal {
     public final static String PROJECT_VERSION = Manager.class.getPackage().getImplementationVersion();
     private final static String USER_AGENT = PROJECT_NAME + " " + PROJECT_VERSION;
 
+    private final static int PREKEY_MINIMUM_COUNT = 20;
+    private static final int PREKEY_BATCH_SIZE = 100;
+
     private final String settingsPath;
     private final String dataPath;
     private final String attachmentsPath;
@@ -140,6 +143,10 @@ class Manager implements Signal {
             groupStore = new JsonGroupStore();
         }
         accountManager = new SignalServiceAccountManager(URL, TRUST_STORE, username, password, USER_AGENT);
+        if (accountManager.getPreKeysCount() < PREKEY_MINIMUM_COUNT) {
+            refreshPreKeys();
+            save();
+        }
     }
 
     private void save() {
@@ -187,12 +194,10 @@ class Manager implements Signal {
         save();
     }
 
-    private static final int BATCH_SIZE = 100;
-
     private List<PreKeyRecord> generatePreKeys() {
         List<PreKeyRecord> records = new LinkedList<>();
 
-        for (int i = 0; i < BATCH_SIZE; i++) {
+        for (int i = 0; i < PREKEY_BATCH_SIZE; i++) {
             int preKeyId = (preKeyIdOffset + i) % Medium.MAX_VALUE;
             ECKeyPair keyPair = Curve.generateKeyPair();
             PreKeyRecord record = new PreKeyRecord(preKeyId, keyPair);
@@ -201,13 +206,13 @@ class Manager implements Signal {
             records.add(record);
         }
 
-        preKeyIdOffset = (preKeyIdOffset + BATCH_SIZE + 1) % Medium.MAX_VALUE;
+        preKeyIdOffset = (preKeyIdOffset + PREKEY_BATCH_SIZE + 1) % Medium.MAX_VALUE;
         save();
 
         return records;
     }
 
-    private PreKeyRecord generateLastResortPreKey() {
+    private PreKeyRecord getOrGenerateLastResortPreKey() {
         if (signalProtocolStore.containsPreKey(Medium.MAX_VALUE)) {
             try {
                 return signalProtocolStore.loadPreKey(Medium.MAX_VALUE);
@@ -249,14 +254,16 @@ class Manager implements Signal {
         //accountManager.setGcmId(Optional.of(GoogleCloudMessaging.getInstance(this).register(REGISTRATION_ID)));
         registered = true;
 
-        List<PreKeyRecord> oneTimePreKeys = generatePreKeys();
-
-        PreKeyRecord lastResortKey = generateLastResortPreKey();
+        refreshPreKeys();
+        save();
+    }
 
+    private void refreshPreKeys() throws IOException {
+        List<PreKeyRecord> oneTimePreKeys = generatePreKeys();
+        PreKeyRecord lastResortKey = getOrGenerateLastResortPreKey();
         SignedPreKeyRecord signedPreKeyRecord = generateSignedPreKey(signalProtocolStore.getIdentityKeyPair());
 
         accountManager.setPreKeys(signalProtocolStore.getIdentityKeyPair().getPublicKey(), lastResortKey, signedPreKeyRecord, oneTimePreKeys);
-        save();
     }