Update libsignal-service

This commit is contained in:
AsamK 2024-09-28 16:39:16 +02:00
parent 8524037900
commit 19dc2d446b
8 changed files with 69 additions and 47 deletions

View File

@ -180,6 +180,8 @@
"pattern":"\\Qkotlin/ranges/ranges.kotlin_builtins\\E" "pattern":"\\Qkotlin/ranges/ranges.kotlin_builtins\\E"
}, { }, {
"pattern":"\\Qkotlin/reflect/reflect.kotlin_builtins\\E" "pattern":"\\Qkotlin/reflect/reflect.kotlin_builtins\\E"
}, {
"pattern":"\\Qlibsignal_jni.so\\E"
}, { }, {
"pattern":"\\Qlibsignal_jni_aarch64.dylib\\E" "pattern":"\\Qlibsignal_jni_aarch64.dylib\\E"
}, { }, {
@ -194,6 +196,8 @@
"pattern":"\\Qorg/slf4j/impl/StaticLoggerBinder.class\\E" "pattern":"\\Qorg/slf4j/impl/StaticLoggerBinder.class\\E"
}, { }, {
"pattern":"\\Qorg/sqlite/native/Linux/x86_64/libsqlitejdbc.so\\E" "pattern":"\\Qorg/sqlite/native/Linux/x86_64/libsqlitejdbc.so\\E"
}, {
"pattern":"\\Qsignal_jni.dll\\E"
}, { }, {
"pattern":"\\Qsignal_jni_amd64.dll\\E" "pattern":"\\Qsignal_jni_amd64.dll\\E"
}, { }, {

View File

@ -194,7 +194,7 @@ public final class IncomingMessageHandler {
) throws ProtocolInvalidKeyException, ProtocolInvalidMessageException, UnsupportedDataMessageException, InvalidMessageStructureException { ) throws ProtocolInvalidKeyException, ProtocolInvalidMessageException, UnsupportedDataMessageException, InvalidMessageStructureException {
final var content = cipherResult.getContent(); final var content = cipherResult.getContent();
final var envelopeMetadata = cipherResult.getMetadata(); final var envelopeMetadata = cipherResult.getMetadata();
final var validationResult = EnvelopeContentValidator.INSTANCE.validate(envelope, content); final var validationResult = EnvelopeContentValidator.INSTANCE.validate(envelope, content, account.getAci());
if (validationResult instanceof EnvelopeContentValidator.Result.Invalid v) { if (validationResult instanceof EnvelopeContentValidator.Result.Invalid v) {
logger.warn("Invalid content! {}", v.getReason(), v.getThrowable()); logger.warn("Invalid content! {}", v.getReason(), v.getThrowable());

View File

@ -39,7 +39,6 @@ import org.whispersystems.signalservice.api.messages.multidevice.ViewedMessage;
import org.whispersystems.signalservice.api.push.ServiceId; import org.whispersystems.signalservice.api.push.ServiceId;
import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.internal.push.SyncMessage; import org.whispersystems.signalservice.internal.push.SyncMessage;
import org.whispersystems.signalservice.internal.push.http.ResumableUploadSpec;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@ -135,15 +134,12 @@ public class SyncHelper {
if (groupsFile.exists() && groupsFile.length() > 0) { if (groupsFile.exists() && groupsFile.length() > 0) {
try (var groupsFileStream = new FileInputStream(groupsFile)) { try (var groupsFileStream = new FileInputStream(groupsFile)) {
final var uploadSpec = context.getDependencies() final var uploadSpec = context.getDependencies().getMessageSender().getResumableUploadSpec();
.getMessageSender()
.getResumableUploadSpec()
.toProto();
var attachmentStream = SignalServiceAttachment.newStreamBuilder() var attachmentStream = SignalServiceAttachment.newStreamBuilder()
.withStream(groupsFileStream) .withStream(groupsFileStream)
.withContentType(MimeUtils.OCTET_STREAM) .withContentType(MimeUtils.OCTET_STREAM)
.withLength(groupsFile.length()) .withLength(groupsFile.length())
.withResumableUploadSpec(ResumableUploadSpec.from(uploadSpec)) .withResumableUploadSpec(uploadSpec)
.build(); .build();
context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forGroups(attachmentStream)); context.getSendHelper().sendSyncMessage(SignalServiceSyncMessage.forGroups(attachmentStream));
@ -197,15 +193,12 @@ public class SyncHelper {
if (contactsFile.exists() && contactsFile.length() > 0) { if (contactsFile.exists() && contactsFile.length() > 0) {
try (var contactsFileStream = new FileInputStream(contactsFile)) { try (var contactsFileStream = new FileInputStream(contactsFile)) {
final var uploadSpec = context.getDependencies() final var uploadSpec = context.getDependencies().getMessageSender().getResumableUploadSpec();
.getMessageSender()
.getResumableUploadSpec()
.toProto();
var attachmentStream = SignalServiceAttachment.newStreamBuilder() var attachmentStream = SignalServiceAttachment.newStreamBuilder()
.withStream(contactsFileStream) .withStream(contactsFileStream)
.withContentType(MimeUtils.OCTET_STREAM) .withContentType(MimeUtils.OCTET_STREAM)
.withLength(contactsFile.length()) .withLength(contactsFile.length())
.withResumableUploadSpec(ResumableUploadSpec.from(uploadSpec)) .withResumableUploadSpec(uploadSpec)
.build(); .build();
context.getSendHelper() context.getSendHelper()

View File

@ -36,6 +36,8 @@ import org.whispersystems.signalservice.api.push.ServiceIdType;
import org.whispersystems.signalservice.api.push.SignalServiceAddress; import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException; import org.whispersystems.signalservice.api.push.exceptions.AuthorizationFailedException;
import org.whispersystems.signalservice.api.util.DeviceNameUtil; import org.whispersystems.signalservice.api.util.DeviceNameUtil;
import org.whispersystems.signalservice.internal.push.ProvisioningSocket;
import org.whispersystems.signalservice.internal.push.PushServiceSocket;
import org.whispersystems.signalservice.internal.util.DynamicCredentialsProvider; import org.whispersystems.signalservice.internal.util.DynamicCredentialsProvider;
import java.io.IOException; import java.io.IOException;
@ -75,13 +77,21 @@ public class ProvisioningManagerImpl implements ProvisioningManager {
tempIdentityKey = KeyUtils.generateIdentityKeyPair(); tempIdentityKey = KeyUtils.generateIdentityKeyPair();
password = KeyUtils.createPassword(); password = KeyUtils.createPassword();
GroupsV2Operations groupsV2Operations = new GroupsV2Operations(ClientZkOperations.create( final var clientZkOperations = ClientZkOperations.create(serviceEnvironmentConfig.signalServiceConfiguration());
serviceEnvironmentConfig.signalServiceConfiguration()), ServiceConfig.GROUP_MAX_SIZE); final var groupsV2Operations = new GroupsV2Operations(clientZkOperations, ServiceConfig.GROUP_MAX_SIZE);
accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.signalServiceConfiguration(), final var credentialsProvider = new DynamicCredentialsProvider(null,
new DynamicCredentialsProvider(null, null, null, password, SignalServiceAddress.DEFAULT_DEVICE_ID), null,
null,
password,
SignalServiceAddress.DEFAULT_DEVICE_ID);
final var pushServiceSocket = new PushServiceSocket(serviceEnvironmentConfig.signalServiceConfiguration(),
credentialsProvider,
userAgent, userAgent,
groupsV2Operations, clientZkOperations.getProfileOperations(),
ServiceConfig.AUTOMATIC_NETWORK_RETRY); ServiceConfig.AUTOMATIC_NETWORK_RETRY);
accountManager = new SignalServiceAccountManager(pushServiceSocket,
new ProvisioningSocket(serviceEnvironmentConfig.signalServiceConfiguration(), userAgent),
groupsV2Operations);
} }
@Override @Override

View File

@ -48,8 +48,8 @@ import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.push.exceptions.AlreadyVerifiedException; import org.whispersystems.signalservice.api.push.exceptions.AlreadyVerifiedException;
import org.whispersystems.signalservice.api.push.exceptions.DeprecatedVersionException; import org.whispersystems.signalservice.api.push.exceptions.DeprecatedVersionException;
import org.whispersystems.signalservice.api.svr.SecureValueRecovery; import org.whispersystems.signalservice.api.svr.SecureValueRecovery;
import org.whispersystems.signalservice.internal.push.PushServiceSocket;
import org.whispersystems.signalservice.internal.push.VerifyAccountResponse; import org.whispersystems.signalservice.internal.push.VerifyAccountResponse;
import org.whispersystems.signalservice.internal.util.DynamicCredentialsProvider;
import java.io.IOException; import java.io.IOException;
import java.util.function.Consumer; import java.util.function.Consumer;
@ -65,9 +65,8 @@ public class RegistrationManagerImpl implements RegistrationManager {
private final ServiceEnvironmentConfig serviceEnvironmentConfig; private final ServiceEnvironmentConfig serviceEnvironmentConfig;
private final String userAgent; private final String userAgent;
private final Consumer<Manager> newManagerListener; private final Consumer<Manager> newManagerListener;
private final GroupsV2Operations groupsV2Operations;
private final SignalServiceAccountManager accountManager; private final SignalServiceAccountManager unauthenticatedAccountManager;
private final PinHelper pinHelper; private final PinHelper pinHelper;
private final AccountFileUpdater accountFileUpdater; private final AccountFileUpdater accountFileUpdater;
@ -86,15 +85,17 @@ public class RegistrationManagerImpl implements RegistrationManager {
this.userAgent = userAgent; this.userAgent = userAgent;
this.newManagerListener = newManagerListener; this.newManagerListener = newManagerListener;
groupsV2Operations = new GroupsV2Operations(ClientZkOperations.create(serviceEnvironmentConfig.signalServiceConfiguration()), this.unauthenticatedAccountManager = SignalServiceAccountManager.createWithStaticCredentials(
ServiceConfig.GROUP_MAX_SIZE); serviceEnvironmentConfig.signalServiceConfiguration(),
this.accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.signalServiceConfiguration(),
new DynamicCredentialsProvider(
// Using empty UUID, because registering doesn't work otherwise // Using empty UUID, because registering doesn't work otherwise
null, null, account.getNumber(), account.getPassword(), SignalServiceAddress.DEFAULT_DEVICE_ID), null,
null,
account.getNumber(),
SignalServiceAddress.DEFAULT_DEVICE_ID,
account.getPassword(),
userAgent, userAgent,
groupsV2Operations, ServiceConfig.AUTOMATIC_NETWORK_RETRY,
ServiceConfig.AUTOMATIC_NETWORK_RETRY); ServiceConfig.GROUP_MAX_SIZE);
final var secureValueRecoveryV2 = serviceEnvironmentConfig.svr2Mrenclaves() final var secureValueRecoveryV2 = serviceEnvironmentConfig.svr2Mrenclaves()
.stream() .stream()
.map(mr -> (SecureValueRecovery) accountManager.getSecureValueRecoveryV2(mr)) .map(mr -> (SecureValueRecovery) accountManager.getSecureValueRecoveryV2(mr))
@ -128,12 +129,14 @@ public class RegistrationManagerImpl implements RegistrationManager {
return; return;
} }
String sessionId = NumberVerificationUtils.handleVerificationSession(accountManager, String sessionId = NumberVerificationUtils.handleVerificationSession(unauthenticatedAccountManager,
account.getSessionId(account.getNumber()), account.getSessionId(account.getNumber()),
id -> account.setSessionId(account.getNumber(), id), id -> account.setSessionId(account.getNumber(), id),
voiceVerification, voiceVerification,
captcha); captcha);
NumberVerificationUtils.requestVerificationCode(accountManager, sessionId, voiceVerification); NumberVerificationUtils.requestVerificationCode(unauthenticatedAccountManager,
sessionId,
voiceVerification);
account.setRegistered(false); account.setRegistered(false);
} catch (DeprecatedVersionException e) { } catch (DeprecatedVersionException e) {
logger.debug("Signal-Server returned deprecated version exception", e); logger.debug("Signal-Server returned deprecated version exception", e);
@ -193,7 +196,7 @@ public class RegistrationManagerImpl implements RegistrationManager {
final var aciPreKeys = generatePreKeysForType(account.getAccountData(ServiceIdType.ACI)); final var aciPreKeys = generatePreKeysForType(account.getAccountData(ServiceIdType.ACI));
final var pniPreKeys = generatePreKeysForType(account.getAccountData(ServiceIdType.PNI)); final var pniPreKeys = generatePreKeysForType(account.getAccountData(ServiceIdType.PNI));
final var response = Utils.handleResponseException(accountManager.registerAccount(null, final var response = Utils.handleResponseException(unauthenticatedAccountManager.registerAccount(null,
recoveryPassword, recoveryPassword,
account.getAccountAttributes(null), account.getAccountAttributes(null),
aciPreKeys, aciPreKeys,
@ -215,11 +218,7 @@ public class RegistrationManagerImpl implements RegistrationManager {
private boolean attemptReactivateAccount() { private boolean attemptReactivateAccount() {
try { try {
final var accountManager = new SignalServiceAccountManager(serviceEnvironmentConfig.signalServiceConfiguration(), final var accountManager = createAuthenticatedSignalServiceAccountManager();
account.getCredentialsProvider(),
userAgent,
groupsV2Operations,
ServiceConfig.AUTOMATIC_NETWORK_RETRY);
accountManager.setAccountAttributes(account.getAccountAttributes(null)); accountManager.setAccountAttributes(account.getAccountAttributes(null));
account.setRegistered(true); account.setRegistered(true);
logger.info("Reactivated existing account, verify is not necessary."); logger.info("Reactivated existing account, verify is not necessary.");
@ -239,6 +238,17 @@ public class RegistrationManagerImpl implements RegistrationManager {
return false; return false;
} }
private SignalServiceAccountManager createAuthenticatedSignalServiceAccountManager() {
final var clientZkOperations = ClientZkOperations.create(serviceEnvironmentConfig.signalServiceConfiguration());
final var pushServiceSocket = new PushServiceSocket(serviceEnvironmentConfig.signalServiceConfiguration(),
account.getCredentialsProvider(),
userAgent,
clientZkOperations.getProfileOperations(),
ServiceConfig.AUTOMATIC_NETWORK_RETRY);
final var groupsV2Operations = new GroupsV2Operations(clientZkOperations, ServiceConfig.GROUP_MAX_SIZE);
return new SignalServiceAccountManager(pushServiceSocket, null, groupsV2Operations);
}
private VerifyAccountResponse verifyAccountWithCode( private VerifyAccountResponse verifyAccountWithCode(
final String sessionId, final String sessionId,
final String verificationCode, final String verificationCode,
@ -247,11 +257,11 @@ public class RegistrationManagerImpl implements RegistrationManager {
final PreKeyCollection pniPreKeys final PreKeyCollection pniPreKeys
) throws IOException { ) throws IOException {
try { try {
Utils.handleResponseException(accountManager.verifyAccount(verificationCode, sessionId)); Utils.handleResponseException(unauthenticatedAccountManager.verifyAccount(verificationCode, sessionId));
} catch (AlreadyVerifiedException e) { } catch (AlreadyVerifiedException e) {
// Already verified so can continue registering // Already verified so can continue registering
} }
return Utils.handleResponseException(accountManager.registerAccount(sessionId, return Utils.handleResponseException(unauthenticatedAccountManager.registerAccount(sessionId,
null, null,
account.getAccountAttributes(registrationLock), account.getAccountAttributes(registrationLock),
aciPreKeys, aciPreKeys,

View File

@ -22,6 +22,7 @@ import org.whispersystems.signalservice.api.svr.SecureValueRecovery;
import org.whispersystems.signalservice.api.util.CredentialsProvider; import org.whispersystems.signalservice.api.util.CredentialsProvider;
import org.whispersystems.signalservice.api.util.UptimeSleepTimer; import org.whispersystems.signalservice.api.util.UptimeSleepTimer;
import org.whispersystems.signalservice.api.websocket.WebSocketFactory; import org.whispersystems.signalservice.api.websocket.WebSocketFactory;
import org.whispersystems.signalservice.internal.push.ProvisioningSocket;
import org.whispersystems.signalservice.internal.push.PushServiceSocket; import org.whispersystems.signalservice.internal.push.PushServiceSocket;
import org.whispersystems.signalservice.internal.websocket.OkHttpWebSocketConnection; import org.whispersystems.signalservice.internal.websocket.OkHttpWebSocketConnection;
import org.whispersystems.signalservice.internal.websocket.WebSocketConnection; import org.whispersystems.signalservice.internal.websocket.WebSocketConnection;
@ -50,6 +51,7 @@ public class SignalDependencies {
private ClientZkOperations clientZkOperations; private ClientZkOperations clientZkOperations;
private PushServiceSocket pushServiceSocket; private PushServiceSocket pushServiceSocket;
private ProvisioningSocket provisioningSocket;
private Network libSignalNetwork; private Network libSignalNetwork;
private SignalWebSocket signalWebSocket; private SignalWebSocket signalWebSocket;
private SignalServiceMessageReceiver messageReceiver; private SignalServiceMessageReceiver messageReceiver;
@ -107,6 +109,12 @@ public class SignalDependencies {
ServiceConfig.AUTOMATIC_NETWORK_RETRY)); ServiceConfig.AUTOMATIC_NETWORK_RETRY));
} }
public ProvisioningSocket getProvisioningSocket() {
return getOrCreate(() -> provisioningSocket,
() -> provisioningSocket = new ProvisioningSocket(getServiceEnvironmentConfig().signalServiceConfiguration(),
userAgent));
}
public Network getLibSignalNetwork() { public Network getLibSignalNetwork() {
return getOrCreate(() -> libSignalNetwork, return getOrCreate(() -> libSignalNetwork,
() -> libSignalNetwork = new Network(serviceEnvironmentConfig.netEnvironment(), userAgent)); () -> libSignalNetwork = new Network(serviceEnvironmentConfig.netEnvironment(), userAgent));
@ -115,14 +123,12 @@ public class SignalDependencies {
public SignalServiceAccountManager getAccountManager() { public SignalServiceAccountManager getAccountManager() {
return getOrCreate(() -> accountManager, return getOrCreate(() -> accountManager,
() -> accountManager = new SignalServiceAccountManager(getPushServiceSocket(), () -> accountManager = new SignalServiceAccountManager(getPushServiceSocket(),
null, getProvisioningSocket(),
serviceEnvironmentConfig.signalServiceConfiguration(),
credentialsProvider,
getGroupsV2Operations())); getGroupsV2Operations()));
} }
public SignalServiceAccountManager createUnauthenticatedAccountManager(String number, String password) { public SignalServiceAccountManager createUnauthenticatedAccountManager(String number, String password) {
return new SignalServiceAccountManager(getServiceEnvironmentConfig().signalServiceConfiguration(), return SignalServiceAccountManager.createWithStaticCredentials(getServiceEnvironmentConfig().signalServiceConfiguration(),
null, null,
null, null,
number, number,
@ -190,14 +196,13 @@ public class SignalDependencies {
public SignalServiceMessageSender getMessageSender() { public SignalServiceMessageSender getMessageSender() {
return getOrCreate(() -> messageSender, return getOrCreate(() -> messageSender,
() -> messageSender = new SignalServiceMessageSender(credentialsProvider, () -> messageSender = new SignalServiceMessageSender(getPushServiceSocket(),
dataStore, dataStore,
sessionLock, sessionLock,
getSignalWebSocket(), getSignalWebSocket(),
Optional.empty(), Optional.empty(),
executor, executor,
ServiceConfig.MAX_ENVELOPE_SIZE, ServiceConfig.MAX_ENVELOPE_SIZE));
getPushServiceSocket()));
} }
public List<SecureValueRecovery> getSecureValueRecoveryV2() { public List<SecureValueRecovery> getSecureValueRecoveryV2() {

View File

@ -15,7 +15,7 @@ dependencyResolutionManagement {
library("slf4j.jul", "org.slf4j", "jul-to-slf4j").versionRef("slf4j") library("slf4j.jul", "org.slf4j", "jul-to-slf4j").versionRef("slf4j")
library("logback", "ch.qos.logback", "logback-classic").version("1.5.8") library("logback", "ch.qos.logback", "logback-classic").version("1.5.8")
library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_107") library("signalservice", "com.github.turasa", "signal-service-java").version("2.15.3_unofficial_108")
library("sqlite", "org.xerial", "sqlite-jdbc").version("3.46.1.0") library("sqlite", "org.xerial", "sqlite-jdbc").version("3.46.1.0")
library("hikari", "com.zaxxer", "HikariCP").version("5.1.0") library("hikari", "com.zaxxer", "HikariCP").version("5.1.0")
library("junit.jupiter", "org.junit.jupiter", "junit-jupiter").version("5.11.0") library("junit.jupiter", "org.junit.jupiter", "junit-jupiter").version("5.11.0")

View File

@ -8,7 +8,7 @@ public class BaseConfig {
public static final String PROJECT_VERSION = BaseConfig.class.getPackage().getImplementationVersion(); public static final String PROJECT_VERSION = BaseConfig.class.getPackage().getImplementationVersion();
static final String USER_AGENT_SIGNAL_ANDROID = Optional.ofNullable(System.getenv("SIGNAL_CLI_USER_AGENT")) static final String USER_AGENT_SIGNAL_ANDROID = Optional.ofNullable(System.getenv("SIGNAL_CLI_USER_AGENT"))
.orElse("Signal-Android/7.16.2"); .orElse("Signal-Android/7.18.2");
static final String USER_AGENT_SIGNAL_CLI = PROJECT_NAME == null static final String USER_AGENT_SIGNAL_CLI = PROJECT_NAME == null
? "signal-cli" ? "signal-cli"
: PROJECT_NAME + "/" + PROJECT_VERSION; : PROJECT_NAME + "/" + PROJECT_VERSION;