From: AsamK Date: Fri, 12 Feb 2021 21:31:33 +0000 (+0100) Subject: Update signal-service-java X-Git-Tag: v0.8.0~4 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/40fc71258160812b56f9dc0b7de511ef764e2633 Update signal-service-java --- diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts index c5d46c4f..b9dfbc21 100644 --- a/lib/build.gradle.kts +++ b/lib/build.gradle.kts @@ -14,7 +14,7 @@ repositories { } dependencies { - api("com.github.turasa:signal-service-java:2.15.3_unofficial_18") + api("com.github.turasa:signal-service-java:2.15.3_unofficial_19") implementation("com.google.protobuf:protobuf-javalite:3.10.0") implementation("org.bouncycastle:bcprov-jdk15on:1.68") implementation("org.slf4j:slf4j-api:1.7.30") diff --git a/lib/src/main/java/org/asamk/signal/manager/Manager.java b/lib/src/main/java/org/asamk/signal/manager/Manager.java index cb28c45b..9661b12c 100644 --- a/lib/src/main/java/org/asamk/signal/manager/Manager.java +++ b/lib/src/main/java/org/asamk/signal/manager/Manager.java @@ -76,7 +76,6 @@ import org.whispersystems.libsignal.IdentityKey; import org.whispersystems.libsignal.IdentityKeyPair; import org.whispersystems.libsignal.InvalidKeyException; import org.whispersystems.libsignal.InvalidMessageException; -import org.whispersystems.libsignal.InvalidVersionException; import org.whispersystems.libsignal.ecc.ECPublicKey; import org.whispersystems.libsignal.state.PreKeyRecord; import org.whispersystems.libsignal.state.SignedPreKeyRecord; @@ -219,7 +218,6 @@ public class Manager implements Closeable { new DynamicCredentialsProvider(account.getUuid(), account.getUsername(), account.getPassword(), - account.getSignalingKey(), account.getDeviceId()), userAgent, groupsV2Operations, @@ -242,7 +240,6 @@ public class Manager implements Closeable { account.getUsername(), account.getPassword(), account.getDeviceId(), - account.getSignalingKey(), userAgent, null, timer, @@ -352,7 +349,7 @@ public class Manager implements Closeable { } public void updateAccountAttributes() throws IOException { - accountManager.setAccountAttributes(account.getSignalingKey(), + accountManager.setAccountAttributes(null, account.getSignalProtocolStore().getLocalRegistrationId(), true, // set legacy pin only if no KBS master key is set @@ -1747,9 +1744,6 @@ public class Manager implements Closeable { } catch (TimeoutException e) { if (returnOnTimeout) return; continue; - } catch (InvalidVersionException e) { - logger.warn("Error while receiving messages, ignoring: {}", e.getMessage()); - continue; } if (envelope.hasSource()) { diff --git a/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java b/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java index c01ceabf..f48ade7c 100644 --- a/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java +++ b/lib/src/main/java/org/asamk/signal/manager/ProvisioningManager.java @@ -69,7 +69,7 @@ public class ProvisioningManager { groupsV2Operations = null; } accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.getSignalServiceConfiguration(), - new DynamicCredentialsProvider(null, null, password, null, SignalServiceAddress.DEFAULT_DEVICE_ID), + new DynamicCredentialsProvider(null, null, password, SignalServiceAddress.DEFAULT_DEVICE_ID), userAgent, groupsV2Operations, ServiceConfig.AUTOMATIC_NETWORK_RETRY, @@ -95,10 +95,8 @@ public class ProvisioningManager { } public String finishDeviceLink(String deviceName) throws IOException, InvalidKeyException, TimeoutException, UserAlreadyExists { - String signalingKey = KeyUtils.createSignalingKey(); SignalServiceAccountManager.NewDeviceRegistrationReturn ret = accountManager.finishNewDeviceRegistration( identityKey, - signalingKey, false, true, registrationId, @@ -130,7 +128,6 @@ public class ProvisioningManager { ret.getDeviceId(), ret.getIdentity(), registrationId, - signalingKey, profileKey)) { account.save(); diff --git a/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java b/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java index 914a5fcf..baff2047 100644 --- a/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java +++ b/lib/src/main/java/org/asamk/signal/manager/RegistrationManager.java @@ -77,11 +77,7 @@ public class RegistrationManager implements Closeable { this.accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.getSignalServiceConfiguration(), new DynamicCredentialsProvider( // Using empty UUID, because registering doesn't work otherwise - null, - account.getUsername(), - account.getPassword(), - account.getSignalingKey(), - SignalServiceAddress.DEFAULT_DEVICE_ID), + null, account.getUsername(), account.getPassword(), SignalServiceAddress.DEFAULT_DEVICE_ID), userAgent, groupsV2Operations, ServiceConfig.AUTOMATIC_NETWORK_RETRY, @@ -142,9 +138,6 @@ public class RegistrationManager implements Closeable { String verificationCode, String pin ) throws IOException, KeyBackupSystemNoDataException, KeyBackupServicePinException { verificationCode = verificationCode.replace("-", ""); - if (account.getSignalingKey() == null) { - account.setSignalingKey(KeyUtils.createSignalingKey()); - } VerifyAccountResponse response; try { response = verifyAccountWithCode(verificationCode, pin, null); @@ -176,6 +169,7 @@ public class RegistrationManager implements Closeable { account.setRegistered(true); account.setUuid(UuidUtil.parseOrNull(response.getUuid())); account.setRegistrationLockPin(pin); + account.getSignalProtocolStore().archiveAllSessions(); account.getSignalProtocolStore() .saveIdentity(account.getSelfAddress(), account.getSignalProtocolStore().getIdentityKeyPair().getPublicKey(), @@ -195,7 +189,7 @@ public class RegistrationManager implements Closeable { final String verificationCode, final String legacyPin, final String registrationLock ) throws IOException { return accountManager.verifyAccountWithCode(verificationCode, - account.getSignalingKey(), + null, account.getSignalProtocolStore().getLocalRegistrationId(), true, legacyPin, diff --git a/lib/src/main/java/org/asamk/signal/manager/config/LiveConfig.java b/lib/src/main/java/org/asamk/signal/manager/config/LiveConfig.java index 80df8bbb..4298547d 100644 --- a/lib/src/main/java/org/asamk/signal/manager/config/LiveConfig.java +++ b/lib/src/main/java/org/asamk/signal/manager/config/LiveConfig.java @@ -9,6 +9,7 @@ import org.whispersystems.signalservice.api.push.TrustStore; import org.whispersystems.signalservice.internal.configuration.SignalCdnUrl; import org.whispersystems.signalservice.internal.configuration.SignalContactDiscoveryUrl; import org.whispersystems.signalservice.internal.configuration.SignalKeyBackupServiceUrl; +import org.whispersystems.signalservice.internal.configuration.SignalProxy; import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration; import org.whispersystems.signalservice.internal.configuration.SignalServiceUrl; import org.whispersystems.signalservice.internal.configuration.SignalStorageUrl; @@ -40,6 +41,7 @@ class LiveConfig { private final static TrustStore TRUST_STORE = new WhisperTrustStore(); private final static Optional dns = Optional.absent(); + private final static Optional proxy = Optional.absent(); private final static byte[] zkGroupServerPublicParams = Base64.getDecoder() .decode("AMhf5ywVwITZMsff/eCyudZx9JDmkkkbV6PInzG4p8x3VqVJSFiMvnvlEKWuRob/1eaIetR31IYeAbm0NdOuHH8Qi+Rexi1wLlpzIo1gstHWBfZzy1+qHRV5A4TqPp15YzBPm0WSggW6PbSn+F4lf57VCnHF7p8SvzAA2ZZJPYJURt8X7bbg+H3i+PEjH9DXItNEqs2sNcug37xZQDLm7X0="); @@ -58,6 +60,7 @@ class LiveConfig { new SignalStorageUrl[]{new SignalStorageUrl(STORAGE_URL, TRUST_STORE)}, interceptors, dns, + proxy, zkGroupServerPublicParams); } diff --git a/lib/src/main/java/org/asamk/signal/manager/config/SandboxConfig.java b/lib/src/main/java/org/asamk/signal/manager/config/SandboxConfig.java index edb180ac..f5adb54d 100644 --- a/lib/src/main/java/org/asamk/signal/manager/config/SandboxConfig.java +++ b/lib/src/main/java/org/asamk/signal/manager/config/SandboxConfig.java @@ -9,6 +9,7 @@ import org.whispersystems.signalservice.api.push.TrustStore; import org.whispersystems.signalservice.internal.configuration.SignalCdnUrl; import org.whispersystems.signalservice.internal.configuration.SignalContactDiscoveryUrl; import org.whispersystems.signalservice.internal.configuration.SignalKeyBackupServiceUrl; +import org.whispersystems.signalservice.internal.configuration.SignalProxy; import org.whispersystems.signalservice.internal.configuration.SignalServiceConfiguration; import org.whispersystems.signalservice.internal.configuration.SignalServiceUrl; import org.whispersystems.signalservice.internal.configuration.SignalStorageUrl; @@ -40,6 +41,7 @@ class SandboxConfig { private final static TrustStore TRUST_STORE = new WhisperTrustStore(); private final static Optional dns = Optional.absent(); + private final static Optional proxy = Optional.absent(); private final static byte[] zkGroupServerPublicParams = Base64.getDecoder() .decode("ABSY21VckQcbSXVNCGRYJcfWHiAMZmpTtTELcDmxgdFbtp/bWsSxZdMKzfCp8rvIs8ocCU3B37fT3r4Mi5qAemeGeR2X+/YmOGR5ofui7tD5mDQfstAI9i+4WpMtIe8KC3wU5w3Inq3uNWVmoGtpKndsNfwJrCg0Hd9zmObhypUnSkfYn2ooMOOnBpfdanRtrvetZUayDMSC5iSRcXKpdls="); @@ -58,6 +60,7 @@ class SandboxConfig { new SignalStorageUrl[]{new SignalStorageUrl(STORAGE_URL, TRUST_STORE)}, interceptors, dns, + proxy, zkGroupServerPublicParams); } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java index 78e30db8..bac42733 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java @@ -73,7 +73,6 @@ public class SignalAccount implements Closeable { private String registrationLockPin; private MasterKey pinMasterKey; private StorageKey storageKey; - private String signalingKey; private ProfileKey profileKey; private int preKeyIdOffset; private int nextSignedPreKeyId; @@ -153,7 +152,6 @@ public class SignalAccount implements Closeable { int deviceId, IdentityKeyPair identityKey, int registrationId, - String signalingKey, ProfileKey profileKey ) throws IOException { IOUtils.createPrivateDirectories(dataPath); @@ -170,7 +168,6 @@ public class SignalAccount implements Closeable { account.password = password; account.profileKey = profileKey; account.deviceId = deviceId; - account.signalingKey = signalingKey; account.signalProtocolStore = new JsonSignalProtocolStore(identityKey, registrationId); account.groupStore = new JsonGroupStore(getGroupCachePath(dataPath, username)); account.contactStore = new JsonContactsStore(); @@ -268,13 +265,6 @@ public class SignalAccount implements Closeable { if (rootNode.hasNonNull("storageKey")) { storageKey = new StorageKey(Base64.getDecoder().decode(rootNode.get("storageKey").asText())); } - if (rootNode.hasNonNull("signalingKey")) { - signalingKey = rootNode.get("signalingKey").asText(); - if (signalingKey.equals("null")) { - // Workaround for load bug in older versions - signalingKey = null; - } - } if (rootNode.hasNonNull("preKeyIdOffset")) { preKeyIdOffset = rootNode.get("preKeyIdOffset").asInt(0); } else { @@ -406,7 +396,6 @@ public class SignalAccount implements Closeable { pinMasterKey == null ? null : Base64.getEncoder().encodeToString(pinMasterKey.serialize())) .put("storageKey", storageKey == null ? null : Base64.getEncoder().encodeToString(storageKey.serialize())) - .put("signalingKey", signalingKey) .put("preKeyIdOffset", preKeyIdOffset) .put("nextSignedPreKeyId", nextSignedPreKeyId) .put("profileKey", Base64.getEncoder().encodeToString(profileKey.serialize())) @@ -552,14 +541,6 @@ public class SignalAccount implements Closeable { this.storageKey = storageKey; } - public String getSignalingKey() { - return signalingKey; - } - - public void setSignalingKey(final String signalingKey) { - this.signalingKey = signalingKey; - } - public ProfileKey getProfileKey() { return profileKey; } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/protocol/JsonSessionStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/protocol/JsonSessionStore.java index de84c895..81a8adb2 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/protocol/JsonSessionStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/protocol/JsonSessionStore.java @@ -13,7 +13,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.libsignal.SignalProtocolAddress; import org.whispersystems.libsignal.state.SessionRecord; -import org.whispersystems.libsignal.state.SessionStore; +import org.whispersystems.signalservice.api.SignalServiceSessionStore; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.util.UuidUtil; @@ -24,7 +24,7 @@ import java.util.LinkedList; import java.util.List; import java.util.UUID; -class JsonSessionStore implements SessionStore { +class JsonSessionStore implements SignalServiceSessionStore { private final static Logger logger = LoggerFactory.getLogger(JsonSessionStore.class); @@ -127,6 +127,27 @@ class JsonSessionStore implements SessionStore { sessions.removeIf(info -> info.address.matches(serviceAddress)); } + @Override + public void archiveSession(final SignalProtocolAddress address) { + final SessionRecord sessionRecord = loadSession(address); + if (sessionRecord == null) { + return; + } + sessionRecord.archiveCurrentState(); + storeSession(address, sessionRecord); + } + + public void archiveAllSessions() { + for (SessionInfo info : sessions) { + try { + final SessionRecord sessionRecord = new SessionRecord(info.sessionRecord); + sessionRecord.archiveCurrentState(); + info.sessionRecord = sessionRecord.serialize(); + } catch (IOException ignored) { + } + } + } + public static class JsonSessionStoreDeserializer extends JsonDeserializer { @Override diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/protocol/JsonSignalProtocolStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/protocol/JsonSignalProtocolStore.java index 41a63013..5a863b6e 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/protocol/JsonSignalProtocolStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/protocol/JsonSignalProtocolStore.java @@ -11,13 +11,13 @@ import org.whispersystems.libsignal.InvalidKeyIdException; import org.whispersystems.libsignal.SignalProtocolAddress; import org.whispersystems.libsignal.state.PreKeyRecord; import org.whispersystems.libsignal.state.SessionRecord; -import org.whispersystems.libsignal.state.SignalProtocolStore; import org.whispersystems.libsignal.state.SignedPreKeyRecord; +import org.whispersystems.signalservice.api.SignalServiceProtocolStore; import org.whispersystems.signalservice.api.push.SignalServiceAddress; import java.util.List; -public class JsonSignalProtocolStore implements SignalProtocolStore { +public class JsonSignalProtocolStore implements SignalServiceProtocolStore { @JsonProperty("preKeys") @JsonDeserialize(using = JsonPreKeyStore.JsonPreKeyStoreDeserializer.class) @@ -171,6 +171,15 @@ public class JsonSignalProtocolStore implements SignalProtocolStore { sessionStore.deleteAllSessions(serviceAddress); } + @Override + public void archiveSession(final SignalProtocolAddress address) { + sessionStore.archiveSession(address); + } + + public void archiveAllSessions() { + sessionStore.archiveAllSessions(); + } + @Override public SignedPreKeyRecord loadSignedPreKey(int signedPreKeyId) throws InvalidKeyIdException { return signedPreKeyStore.loadSignedPreKey(signedPreKeyId);