account = SignalAccount.createOrUpdateLinkedAccount(pathConfig.dataPath(),
accountPath,
number,
+ serviceEnvironmentConfig.getType(),
aci,
pni,
password,
logger.debug("Account is a master device.");
return false;
}
+ if (signalAccount.isRegistered()
+ && signalAccount.getServiceEnvironment() != null
+ && signalAccount.getServiceEnvironment() != serviceEnvironmentConfig.getType()) {
+ logger.debug("Account is registered in another environment: {}.",
+ signalAccount.getServiceEnvironment());
+ return false;
+ }
final var m = new ManagerImpl(signalAccount,
pathConfig,
@Override
public void register(boolean voiceVerification, String captcha) throws IOException, CaptchaRequiredException {
+ if (account.isRegistered()
+ && account.getServiceEnvironment() != null
+ && account.getServiceEnvironment() != serviceEnvironmentConfig.getType()) {
+ throw new IOException("Account is registered in another environment: " + account.getServiceEnvironment());
+ }
+
if (account.getAci() != null && attemptReactivateAccount()) {
return;
}
private static final Logger logger = LoggerFactory.getLogger(MultiAccountManager.class);
private final PathConfig pathConfig;
+ private final ServiceEnvironment serviceEnvironment;
private final ServiceEnvironmentConfig serviceEnvironmentConfig;
private final String userAgent;
private final TrustNewIdentity trustNewIdentity;
final TrustNewIdentity trustNewIdentity
) throws IOException {
this.pathConfig = PathConfig.createDefault(settingsPath);
- this.serviceEnvironmentConfig = ServiceConfig.getServiceEnvironmentConfig(serviceEnvironment, userAgent);
+ this.serviceEnvironment = serviceEnvironment;
+ this.serviceEnvironmentConfig = ServiceConfig.getServiceEnvironmentConfig(this.serviceEnvironment, userAgent);
this.userAgent = userAgent;
this.trustNewIdentity = trustNewIdentity;
this.accountsStore = new AccountsStore(pathConfig.dataPath());
throw new NotRegisteredException();
}
+ if (account.getServiceEnvironment() != null && account.getServiceEnvironment() != serviceEnvironment) {
+ throw new IOException("Account is registered in another environment: " + account.getServiceEnvironment());
+ }
+
account.initDatabase();
final var manager = new ManagerImpl(account,
throw new AccountCheckException("Error while checking account " + number + ": " + e.getMessage(), e);
}
+ if (account.getServiceEnvironment() == null) {
+ account.setServiceEnvironment(serviceEnvironment);
+ }
+
return manager;
}
var account = SignalAccount.create(pathConfig.dataPath(),
newAccountPath,
number,
+ serviceEnvironment,
aciIdentityKey,
pniIdentityKey,
registrationId,
final var interceptors = List.of(userAgentInterceptor);
return switch (serviceEnvironment) {
- case LIVE -> new ServiceEnvironmentConfig(LiveConfig.createDefaultServiceConfiguration(interceptors),
+ case LIVE -> new ServiceEnvironmentConfig(serviceEnvironment,
+ LiveConfig.createDefaultServiceConfiguration(interceptors),
LiveConfig.getUnidentifiedSenderTrustRoot(),
LiveConfig.createKeyBackupConfig(),
LiveConfig.getCdsMrenclave());
- case STAGING -> new ServiceEnvironmentConfig(StagingConfig.createDefaultServiceConfiguration(interceptors),
+ case STAGING -> new ServiceEnvironmentConfig(serviceEnvironment,
+ StagingConfig.createDefaultServiceConfiguration(interceptors),
StagingConfig.getUnidentifiedSenderTrustRoot(),
StagingConfig.createKeyBackupConfig(),
StagingConfig.getCdsMrenclave());
public class ServiceEnvironmentConfig {
+ private final ServiceEnvironment type;
private final SignalServiceConfiguration signalServiceConfiguration;
private final ECPublicKey unidentifiedSenderTrustRoot;
private final String cdsMrenclave;
public ServiceEnvironmentConfig(
+ final ServiceEnvironment type,
final SignalServiceConfiguration signalServiceConfiguration,
final ECPublicKey unidentifiedSenderTrustRoot,
final KeyBackupConfig keyBackupConfig,
final String cdsMrenclave
) {
+ this.type = type;
this.signalServiceConfiguration = signalServiceConfiguration;
this.unidentifiedSenderTrustRoot = unidentifiedSenderTrustRoot;
this.keyBackupConfig = keyBackupConfig;
this.cdsMrenclave = cdsMrenclave;
}
+ public ServiceEnvironment getType() {
+ return type;
+ }
+
public SignalServiceConfiguration getSignalServiceConfiguration() {
return signalServiceConfiguration;
}
import org.asamk.signal.manager.api.Pair;
import org.asamk.signal.manager.api.TrustLevel;
+import org.asamk.signal.manager.config.ServiceEnvironment;
import org.asamk.signal.manager.groups.GroupId;
import org.asamk.signal.manager.storage.configuration.ConfigurationStore;
import org.asamk.signal.manager.storage.contacts.ContactsStore;
private File dataPath;
private String accountPath;
+ private ServiceEnvironment serviceEnvironment;
private String number;
private ACI aci;
private PNI pni;
File dataPath,
String accountPath,
String number,
+ ServiceEnvironment serviceEnvironment,
IdentityKeyPair aciIdentityKey,
IdentityKeyPair pniIdentityKey,
int registrationId,
signalAccount.accountPath = accountPath;
signalAccount.number = number;
+ signalAccount.serviceEnvironment = serviceEnvironment;
signalAccount.profileKey = profileKey;
signalAccount.dataPath = dataPath;
File dataPath,
String accountPath,
String number,
+ ServiceEnvironment serviceEnvironment,
ACI aci,
PNI pni,
String password,
return createLinkedAccount(dataPath,
accountPath,
number,
+ serviceEnvironment,
aci,
pni,
password,
File dataPath,
String accountPath,
String number,
+ ServiceEnvironment serviceEnvironment,
ACI aci,
PNI pni,
String password,
signalAccount.dataPath = dataPath;
signalAccount.accountPath = accountPath;
+ signalAccount.serviceEnvironment = serviceEnvironment;
signalAccount.localRegistrationId = registrationId;
signalAccount.trustNewIdentity = trustNewIdentity;
signalAccount.groupStore = new GroupStore(getGroupCachePath(dataPath, accountPath),
if (rootNode.hasNonNull("password")) {
password = rootNode.get("password").asText();
}
+ if (rootNode.hasNonNull("serviceEnvironment")) {
+ serviceEnvironment = ServiceEnvironment.valueOf(rootNode.get("serviceEnvironment").asText());
+ }
registered = Utils.getNotNullNode(rootNode, "registered").asBoolean();
if (rootNode.hasNonNull("uuid")) {
try {
var rootNode = jsonProcessor.createObjectNode();
rootNode.put("version", CURRENT_STORAGE_VERSION)
.put("username", number)
+ .put("serviceEnvironment", serviceEnvironment == null ? null : serviceEnvironment.name())
.put("uuid", aci == null ? null : aci.toString())
.put("pni", pni == null ? null : pni.toString())
.put("deviceName", encryptedDeviceName)
save();
}
+ public ServiceEnvironment getServiceEnvironment() {
+ return serviceEnvironment;
+ }
+
+ public void setServiceEnvironment(final ServiceEnvironment serviceEnvironment) {
+ this.serviceEnvironment = serviceEnvironment;
+ save();
+ }
+
public ACI getAci() {
return aci;
}