]> nmode's Git Repositories - signal-cli/commitdiff
Store information if account is registerd on LIVE or STAGING env in account file
authorAsamK <asamk@gmx.de>
Sun, 15 May 2022 14:13:01 +0000 (16:13 +0200)
committerAsamK <asamk@gmx.de>
Mon, 16 May 2022 10:27:43 +0000 (12:27 +0200)
Fixes #896

lib/src/main/java/org/asamk/signal/manager/ProvisioningManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/RegistrationManagerImpl.java
lib/src/main/java/org/asamk/signal/manager/SignalAccountFiles.java
lib/src/main/java/org/asamk/signal/manager/config/ServiceConfig.java
lib/src/main/java/org/asamk/signal/manager/config/ServiceEnvironmentConfig.java
lib/src/main/java/org/asamk/signal/manager/storage/SignalAccount.java

index 7519950e28c17694fa7d7c2fb25d0ab5cbbcbebb..7d396bb1e2b34dea9b38ef8b5d10cb50b8afbf05 100644 (file)
@@ -136,6 +136,7 @@ class ProvisioningManagerImpl implements ProvisioningManager {
             account = SignalAccount.createOrUpdateLinkedAccount(pathConfig.dataPath(),
                     accountPath,
                     number,
             account = SignalAccount.createOrUpdateLinkedAccount(pathConfig.dataPath(),
                     accountPath,
                     number,
+                    serviceEnvironmentConfig.getType(),
                     aci,
                     pni,
                     password,
                     aci,
                     pni,
                     password,
@@ -209,6 +210,13 @@ class ProvisioningManagerImpl implements ProvisioningManager {
                 logger.debug("Account is a master device.");
                 return false;
             }
                 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,
 
             final var m = new ManagerImpl(signalAccount,
                     pathConfig,
index 133bd8b8c6460cbbffbd192c1bc0d8444a89b2e0..ebafe24b2e73a6e2325157b6e208cce2e323a1fe 100644 (file)
@@ -95,6 +95,12 @@ class RegistrationManagerImpl implements RegistrationManager {
 
     @Override
     public void register(boolean voiceVerification, String captcha) throws IOException, CaptchaRequiredException {
 
     @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;
         }
         if (account.getAci() != null && attemptReactivateAccount()) {
             return;
         }
index 0ca9b0abbdebf4588b0d19f3e210572ab92d1efd..5f0f551c5dfc800afa3df596ff9d9480fd89cebb 100644 (file)
@@ -24,6 +24,7 @@ public class SignalAccountFiles {
     private static final Logger logger = LoggerFactory.getLogger(MultiAccountManager.class);
 
     private final PathConfig pathConfig;
     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;
     private final ServiceEnvironmentConfig serviceEnvironmentConfig;
     private final String userAgent;
     private final TrustNewIdentity trustNewIdentity;
@@ -36,7 +37,8 @@ public class SignalAccountFiles {
             final TrustNewIdentity trustNewIdentity
     ) throws IOException {
         this.pathConfig = PathConfig.createDefault(settingsPath);
             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());
         this.userAgent = userAgent;
         this.trustNewIdentity = trustNewIdentity;
         this.accountsStore = new AccountsStore(pathConfig.dataPath());
@@ -85,6 +87,10 @@ public class SignalAccountFiles {
             throw new NotRegisteredException();
         }
 
             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,
         account.initDatabase();
 
         final var manager = new ManagerImpl(account,
@@ -100,6 +106,10 @@ public class SignalAccountFiles {
             throw new AccountCheckException("Error while checking account " + number + ": " + e.getMessage(), e);
         }
 
             throw new AccountCheckException("Error while checking account " + number + ": " + e.getMessage(), e);
         }
 
+        if (account.getServiceEnvironment() == null) {
+            account.setServiceEnvironment(serviceEnvironment);
+        }
+
         return manager;
     }
 
         return manager;
     }
 
@@ -133,6 +143,7 @@ public class SignalAccountFiles {
             var account = SignalAccount.create(pathConfig.dataPath(),
                     newAccountPath,
                     number,
             var account = SignalAccount.create(pathConfig.dataPath(),
                     newAccountPath,
                     number,
+                    serviceEnvironment,
                     aciIdentityKey,
                     pniIdentityKey,
                     registrationId,
                     aciIdentityKey,
                     pniIdentityKey,
                     registrationId,
index 422d0db703c03fe2ad55eae9aa9f9d86d11f3d2f..91b07ce3c1e7e62b61d5d214cfcf8ab173dde2f0 100644 (file)
@@ -75,11 +75,13 @@ public class ServiceConfig {
         final var interceptors = List.of(userAgentInterceptor);
 
         return switch (serviceEnvironment) {
         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());
                     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());
                     StagingConfig.getUnidentifiedSenderTrustRoot(),
                     StagingConfig.createKeyBackupConfig(),
                     StagingConfig.getCdsMrenclave());
index 9dac7edd88076b6415e8c0cf4935358435078755..b6a6af1d3b05d4ba54ad5b500168716212c4973e 100644 (file)
@@ -5,6 +5,7 @@ import org.whispersystems.signalservice.internal.configuration.SignalServiceConf
 
 public class ServiceEnvironmentConfig {
 
 
 public class ServiceEnvironmentConfig {
 
+    private final ServiceEnvironment type;
     private final SignalServiceConfiguration signalServiceConfiguration;
 
     private final ECPublicKey unidentifiedSenderTrustRoot;
     private final SignalServiceConfiguration signalServiceConfiguration;
 
     private final ECPublicKey unidentifiedSenderTrustRoot;
@@ -14,17 +15,23 @@ public class ServiceEnvironmentConfig {
     private final String cdsMrenclave;
 
     public ServiceEnvironmentConfig(
     private final String cdsMrenclave;
 
     public ServiceEnvironmentConfig(
+            final ServiceEnvironment type,
             final SignalServiceConfiguration signalServiceConfiguration,
             final ECPublicKey unidentifiedSenderTrustRoot,
             final KeyBackupConfig keyBackupConfig,
             final String cdsMrenclave
     ) {
             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;
     }
 
         this.signalServiceConfiguration = signalServiceConfiguration;
         this.unidentifiedSenderTrustRoot = unidentifiedSenderTrustRoot;
         this.keyBackupConfig = keyBackupConfig;
         this.cdsMrenclave = cdsMrenclave;
     }
 
+    public ServiceEnvironment getType() {
+        return type;
+    }
+
     public SignalServiceConfiguration getSignalServiceConfiguration() {
         return signalServiceConfiguration;
     }
     public SignalServiceConfiguration getSignalServiceConfiguration() {
         return signalServiceConfiguration;
     }
index 66f515aef0bfc33f60db0501775efb746cfe4619..ec8434cc787ca039013d938c84131d380fd4a1f1 100644 (file)
@@ -5,6 +5,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 
 import org.asamk.signal.manager.api.Pair;
 import org.asamk.signal.manager.api.TrustLevel;
 
 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;
 import org.asamk.signal.manager.groups.GroupId;
 import org.asamk.signal.manager.storage.configuration.ConfigurationStore;
 import org.asamk.signal.manager.storage.contacts.ContactsStore;
@@ -95,6 +96,7 @@ public class SignalAccount implements Closeable {
 
     private File dataPath;
     private String accountPath;
 
     private File dataPath;
     private String accountPath;
+    private ServiceEnvironment serviceEnvironment;
     private String number;
     private ACI aci;
     private PNI pni;
     private String number;
     private ACI aci;
     private PNI pni;
@@ -170,6 +172,7 @@ public class SignalAccount implements Closeable {
             File dataPath,
             String accountPath,
             String number,
             File dataPath,
             String accountPath,
             String number,
+            ServiceEnvironment serviceEnvironment,
             IdentityKeyPair aciIdentityKey,
             IdentityKeyPair pniIdentityKey,
             int registrationId,
             IdentityKeyPair aciIdentityKey,
             IdentityKeyPair pniIdentityKey,
             int registrationId,
@@ -187,6 +190,7 @@ public class SignalAccount implements Closeable {
 
         signalAccount.accountPath = accountPath;
         signalAccount.number = number;
 
         signalAccount.accountPath = accountPath;
         signalAccount.number = number;
+        signalAccount.serviceEnvironment = serviceEnvironment;
         signalAccount.profileKey = profileKey;
 
         signalAccount.dataPath = dataPath;
         signalAccount.profileKey = profileKey;
 
         signalAccount.dataPath = dataPath;
@@ -213,6 +217,7 @@ public class SignalAccount implements Closeable {
             File dataPath,
             String accountPath,
             String number,
             File dataPath,
             String accountPath,
             String number,
+            ServiceEnvironment serviceEnvironment,
             ACI aci,
             PNI pni,
             String password,
             ACI aci,
             PNI pni,
             String password,
@@ -230,6 +235,7 @@ public class SignalAccount implements Closeable {
             return createLinkedAccount(dataPath,
                     accountPath,
                     number,
             return createLinkedAccount(dataPath,
                     accountPath,
                     number,
+                    serviceEnvironment,
                     aci,
                     pni,
                     password,
                     aci,
                     pni,
                     password,
@@ -279,6 +285,7 @@ public class SignalAccount implements Closeable {
             File dataPath,
             String accountPath,
             String number,
             File dataPath,
             String accountPath,
             String number,
+            ServiceEnvironment serviceEnvironment,
             ACI aci,
             PNI pni,
             String password,
             ACI aci,
             PNI pni,
             String password,
@@ -308,6 +315,7 @@ public class SignalAccount implements Closeable {
 
         signalAccount.dataPath = dataPath;
         signalAccount.accountPath = accountPath;
 
         signalAccount.dataPath = dataPath;
         signalAccount.accountPath = accountPath;
+        signalAccount.serviceEnvironment = serviceEnvironment;
         signalAccount.localRegistrationId = registrationId;
         signalAccount.trustNewIdentity = trustNewIdentity;
         signalAccount.groupStore = new GroupStore(getGroupCachePath(dataPath, accountPath),
         signalAccount.localRegistrationId = registrationId;
         signalAccount.trustNewIdentity = trustNewIdentity;
         signalAccount.groupStore = new GroupStore(getGroupCachePath(dataPath, accountPath),
@@ -489,6 +497,9 @@ public class SignalAccount implements Closeable {
         if (rootNode.hasNonNull("password")) {
             password = rootNode.get("password").asText();
         }
         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 {
         registered = Utils.getNotNullNode(rootNode, "registered").asBoolean();
         if (rootNode.hasNonNull("uuid")) {
             try {
@@ -814,6 +825,7 @@ public class SignalAccount implements Closeable {
             var rootNode = jsonProcessor.createObjectNode();
             rootNode.put("version", CURRENT_STORAGE_VERSION)
                     .put("username", number)
             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)
                     .put("uuid", aci == null ? null : aci.toString())
                     .put("pni", pni == null ? null : pni.toString())
                     .put("deviceName", encryptedDeviceName)
@@ -1109,6 +1121,15 @@ public class SignalAccount implements Closeable {
         save();
     }
 
         save();
     }
 
+    public ServiceEnvironment getServiceEnvironment() {
+        return serviceEnvironment;
+    }
+
+    public void setServiceEnvironment(final ServiceEnvironment serviceEnvironment) {
+        this.serviceEnvironment = serviceEnvironment;
+        save();
+    }
+
     public ACI getAci() {
         return aci;
     }
     public ACI getAci() {
         return aci;
     }