]> nmode's Git Repositories - signal-cli/commitdiff
Store profile sharing for group v2
authorAsamK <asamk@gmx.de>
Sun, 28 Jan 2024 17:18:40 +0000 (18:18 +0100)
committerAsamK <asamk@gmx.de>
Sun, 28 Jan 2024 21:38:41 +0000 (22:38 +0100)
lib/src/main/java/org/asamk/signal/manager/helper/GroupHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/ProfileHelper.java
lib/src/main/java/org/asamk/signal/manager/helper/SendHelper.java
lib/src/main/java/org/asamk/signal/manager/storage/AccountDatabase.java
lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfo.java
lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV1.java
lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupInfoV2.java
lib/src/main/java/org/asamk/signal/manager/storage/groups/GroupStore.java
lib/src/main/java/org/asamk/signal/manager/storage/groups/LegacyGroupStore.java
lib/src/main/java/org/asamk/signal/manager/syncStorage/GroupV2RecordProcessor.java
lib/src/main/java/org/asamk/signal/manager/syncStorage/StorageSyncModels.java

index dec9185a815f29b289a6dbf0924cf37126acafab..8f7b28695816e5d02c713d4ee6a6df84fd3885db 100644 (file)
@@ -166,6 +166,7 @@ public class GroupHelper {
         if (gv2Pair == null) {
             // Failed to create v2 group, creating v1 group instead
             var gv1 = new GroupInfoV1(GroupIdV1.createRandom());
+            gv1.setProfileSharingEnabled(true);
             gv1.addMembers(List.of(selfRecipientId));
             final var result = updateGroupV1(gv1, name, members, avatarBytes);
             return new Pair<>(gv1.getGroupId(), result);
@@ -175,6 +176,7 @@ public class GroupHelper {
         final var decryptedGroup = gv2Pair.second();
 
         gv2.setGroup(decryptedGroup);
+        gv2.setProfileSharingEnabled(true);
         if (avatarBytes != null) {
             context.getAvatarStore()
                     .storeGroupAvatar(gv2.getGroupId(), outputStream -> outputStream.write(avatarBytes));
index dbde28a75ec57a54f3a93b37972909e905950689..5d6b90d453316729ddf95359432ab273bfb56483 100644 (file)
@@ -80,7 +80,7 @@ public final class ProfileHelper {
         final var activeGroupIds = account.getGroupStore()
                 .getGroups()
                 .stream()
-                .filter(g -> g instanceof GroupInfoV2 && g.isMember(selfRecipientId))
+                .filter(g -> g instanceof GroupInfoV2 && g.isMember(selfRecipientId) && g.isProfileSharingEnabled())
                 .map(g -> (GroupInfoV2) g)
                 .map(GroupInfoV2::getGroupId)
                 .toList();
index 38e8de1749a12a86350c260960f7e2b5f6e4d273..a9ca6a1267049ead4fc68539e0e6d68149f09905 100644 (file)
@@ -454,6 +454,10 @@ public class SendHelper {
         if (!g.isMember(account.getSelfRecipientId())) {
             throw new NotAGroupMemberException(groupId, g.getTitle());
         }
+        if (!g.isProfileSharingEnabled()) {
+            g.setProfileSharingEnabled(true);
+            account.getGroupStore().updateGroup(g);
+        }
         return g;
     }
 
index bedf43329e59e6e8c26d76a06541959e958f90fc..ba51d9c057c4256335bb15a5f8e1eea568788f7c 100644 (file)
@@ -33,7 +33,7 @@ import java.util.UUID;
 public class AccountDatabase extends Database {
 
     private static final Logger logger = LoggerFactory.getLogger(AccountDatabase.class);
-    private static final long DATABASE_VERSION = 22;
+    private static final long DATABASE_VERSION = 23;
 
     private AccountDatabase(final HikariDataSource dataSource) {
         super(logger, DATABASE_VERSION, dataSource);
@@ -565,6 +565,14 @@ public class AccountDatabase extends Database {
                                         """);
             }
         }
+        if (oldVersion < 23) {
+            logger.debug("Updating database: Create group profile sharing column");
+            try (final var statement = connection.createStatement()) {
+                statement.executeUpdate("""
+                                        ALTER TABLE group_v2 ADD profile_sharing INTEGER NOT NULL DEFAULT TRUE;
+                                        """);
+            }
+        }
     }
 
     private static void createUuidMappingTable(
index a16af0ff34921959f44588d891c63043b7eff6fd..7de3a8f9bb537ab54229848ee0b191656f45d17c 100644 (file)
@@ -46,6 +46,10 @@ public sealed abstract class GroupInfo permits GroupInfoV1, GroupInfoV2 {
 
     public abstract void setBlocked(boolean blocked);
 
+    public abstract boolean isProfileSharingEnabled();
+
+    public abstract void setProfileSharingEnabled(boolean profileSharingEnabled);
+
     public abstract int getMessageExpirationTimer();
 
     public abstract boolean isAnnouncementGroup();
index fd7bfe850235e6e40293f6087d8cef35fd615af2..f377ff2d09744ad915f814ec547f1322e734160d 100644 (file)
@@ -94,6 +94,15 @@ public final class GroupInfoV1 extends GroupInfo {
         this.blocked = blocked;
     }
 
+    @Override
+    public boolean isProfileSharingEnabled() {
+        return true;
+    }
+
+    @Override
+    public void setProfileSharingEnabled(final boolean profileSharingEnabled) {
+    }
+
     @Override
     public int getMessageExpirationTimer() {
         return messageExpirationTime;
index 8ddec54ef308ee9b380a668bfae0ba54e6fdc8cc..89306ecd18638e4dc9ee8a5bee632132fed1836f 100644 (file)
@@ -23,6 +23,7 @@ public final class GroupInfoV2 extends GroupInfo {
     private final GroupMasterKey masterKey;
     private final DistributionId distributionId;
     private boolean blocked;
+    private boolean profileSharingEnabled;
     private DecryptedGroup group;
     private byte[] storageRecord;
     private boolean permissionDenied;
@@ -44,6 +45,7 @@ public final class GroupInfoV2 extends GroupInfo {
             final DecryptedGroup group,
             final DistributionId distributionId,
             final boolean blocked,
+            final boolean profileSharingEnabled,
             final boolean permissionDenied,
             final byte[] storageRecord,
             final RecipientResolver recipientResolver
@@ -53,6 +55,7 @@ public final class GroupInfoV2 extends GroupInfo {
         this.group = group;
         this.distributionId = distributionId;
         this.blocked = blocked;
+        this.profileSharingEnabled = profileSharingEnabled;
         this.permissionDenied = permissionDenied;
         this.storageRecord = storageRecord;
         this.recipientResolver = recipientResolver;
@@ -183,6 +186,16 @@ public final class GroupInfoV2 extends GroupInfo {
         this.blocked = blocked;
     }
 
+    @Override
+    public boolean isProfileSharingEnabled() {
+        return profileSharingEnabled;
+    }
+
+    @Override
+    public void setProfileSharingEnabled(final boolean profileSharingEnabled) {
+        this.profileSharingEnabled = profileSharingEnabled;
+    }
+
     @Override
     public int getMessageExpirationTimer() {
         return this.group != null && this.group.disappearingMessagesTimer != null
index 5079da07f0f118f656262a21fb0c07f145c7007b..5ebac9c50e7c3b0eca15177d92b2718319c6d4ee 100644 (file)
@@ -59,6 +59,7 @@ public class GroupStore {
                                       group_data BLOB,
                                       distribution_id BLOB UNIQUE NOT NULL,
                                       blocked INTEGER NOT NULL DEFAULT FALSE,
+                                      profile_sharing INTEGER NOT NULL DEFAULT FALSE,
                                       permission_denied INTEGER NOT NULL DEFAULT FALSE
                                     ) STRICT;
                                     CREATE TABLE group_v1 (
@@ -508,8 +509,8 @@ public class GroupStore {
         } else if (group instanceof GroupInfoV2 groupV2) {
             final var sql = (
                     """
-                    INSERT OR REPLACE INTO %s (_id, group_id, master_key, group_data, distribution_id, blocked, distribution_id, storage_id)
-                    VALUES (?, ?, ?, ?, ?, ?, ?, ?)
+                    INSERT OR REPLACE INTO %s (_id, group_id, master_key, group_data, distribution_id, blocked, permission_denied, storage_id, profile_sharing)
+                    VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
                     """
             ).formatted(TABLE_GROUP_V2);
             try (final var statement = connection.prepareStatement(sql)) {
@@ -529,6 +530,7 @@ public class GroupStore {
                 statement.setBoolean(6, groupV2.isBlocked());
                 statement.setBoolean(7, groupV2.isPermissionDenied());
                 statement.setBytes(8, KeyUtils.createRawStorageId());
+                statement.setBoolean(9, groupV2.isProfileSharingEnabled());
                 statement.executeUpdate();
             }
         } else {
@@ -539,7 +541,7 @@ public class GroupStore {
     private List<GroupInfoV2> getGroupsV2() {
         final var sql = (
                 """
-                SELECT g.group_id, g.master_key, g.group_data, g.distribution_id, g.blocked, g.permission_denied, g.storage_record
+                SELECT g.group_id, g.master_key, g.group_data, g.distribution_id, g.blocked, g.profile_sharing, g.permission_denied, g.storage_record
                 FROM %s g
                 """
         ).formatted(TABLE_GROUP_V2);
@@ -557,7 +559,7 @@ public class GroupStore {
     public GroupInfoV2 getGroup(Connection connection, GroupIdV2 groupIdV2) throws SQLException {
         final var sql = (
                 """
-                SELECT g.group_id, g.master_key, g.group_data, g.distribution_id, g.blocked, g.permission_denied, g.storage_record
+                SELECT g.group_id, g.master_key, g.group_data, g.distribution_id, g.blocked, g.profile_sharing, g.permission_denied, g.storage_record
                 FROM %s g
                 WHERE g.group_id = ?
                 """
@@ -591,7 +593,7 @@ public class GroupStore {
     public GroupInfoV2 getGroupV2(Connection connection, StorageId storageId) throws SQLException {
         final var sql = (
                 """
-                SELECT g.group_id, g.master_key, g.group_data, g.distribution_id, g.blocked, g.permission_denied, g.storage_record
+                SELECT g.group_id, g.master_key, g.group_data, g.distribution_id, g.blocked, g.profile_sharing, g.permission_denied, g.storage_record
                 FROM %s g
                 WHERE g.storage_id = ?
                 """
@@ -614,6 +616,7 @@ public class GroupStore {
             final var groupData = resultSet.getBytes("group_data");
             final var distributionId = resultSet.getBytes("distribution_id");
             final var blocked = resultSet.getBoolean("blocked");
+            final var profileSharingEnabled = resultSet.getBoolean("profile_sharing");
             final var permissionDenied = resultSet.getBoolean("permission_denied");
             final var storageRecord = resultSet.getBytes("storage_record");
             return new GroupInfoV2(GroupId.v2(groupId),
@@ -621,6 +624,7 @@ public class GroupStore {
                     groupData == null ? null : DecryptedGroup.ADAPTER.decode(groupData),
                     DistributionId.from(UuidUtil.parseOrThrow(distributionId)),
                     blocked,
+                    profileSharingEnabled,
                     permissionDenied,
                     storageRecord,
                     recipientResolver);
index b5698b51b38abe6136e323d31566493ea5a0c181..1d8c8799bc5741e0b4ae9dfc3acb89f9ff0288d8 100644 (file)
@@ -77,6 +77,7 @@ public class LegacyGroupStore {
                     loadDecryptedGroupLocked(groupId, groupCachePath),
                     g2.distributionId == null ? DistributionId.create() : DistributionId.from(g2.distributionId),
                     g2.blocked,
+                    true,
                     g2.permissionDenied,
                     null,
                     recipientResolver);
index 4d41901aaf9bccb2a8d8d9a9b168d96648a27f54..1b1827697ffab6f01da42d890c0ebe7885944231 100644 (file)
@@ -92,6 +92,7 @@ public final class GroupV2RecordProcessor extends DefaultStorageRecordProcessor<
 
         final var group = account.getGroupStore().getGroupOrPartialMigrate(connection, groupMasterKey);
         group.setBlocked(groupV2Record.isBlocked());
+        group.setProfileSharingEnabled(groupV2Record.isProfileSharingEnabled());
         account.getGroupStore().updateGroup(connection, group);
         account.getGroupStore()
                 .storeStorageRecord(connection,
index c438570c2a4f6c11644f8f899c8cea4865cd962d..a8d10142e6ed62e5b074674b2cbe7ff83e70eb8b 100644 (file)
@@ -119,7 +119,9 @@ public final class StorageSyncModels {
         final var builder = new SignalGroupV1Record.Builder(rawStorageId,
                 group.getGroupId().serialize(),
                 group.getStorageRecord());
-        builder.setBlocked(group.isBlocked()).setArchived(group.archived);
+        builder.setBlocked(group.isBlocked());
+        builder.setArchived(group.archived);
+        builder.setProfileSharingEnabled(true);
         return SignalStorageRecord.forGroupV1(builder.build());
     }
 
@@ -130,6 +132,7 @@ public final class StorageSyncModels {
                 group.getMasterKey(),
                 group.getStorageRecord());
         builder.setBlocked(group.isBlocked());
+        builder.setProfileSharingEnabled(group.isProfileSharingEnabled());
         return SignalStorageRecord.forGroupV2(builder.build());
     }