From f23c52557b6e7cef4119bbb19bf367e786ffcf71 Mon Sep 17 00:00:00 2001 From: Audric Ackermann Date: Thu, 7 Sep 2023 16:21:36 +1000 Subject: [PATCH] feat: add protobuf changes for new groups --- protos/SignalService.proto | 124 ++++++++++++------ .../browser/libsession_worker_interface.ts | 16 +++ 2 files changed, 102 insertions(+), 38 deletions(-) diff --git a/protos/SignalService.proto b/protos/SignalService.proto index 4bbb80a83..cf1db982d 100644 --- a/protos/SignalService.proto +++ b/protos/SignalService.proto @@ -44,9 +44,9 @@ message SharedConfigMessage { CONTACTS = 2; CONVO_INFO_VOLATILE = 3; USER_GROUPS = 4; - // CLOSED_GROUP_INFO = 5; - // CLOSED_GROUP_MEMBERS = 6; - // ENCRYPTION_KEYS = 7; + GROUP_INFO = 5; + GROUP_MEMBERS = 6; + GROUP_KEYS = 7; } required Kind kind = 1; @@ -85,41 +85,90 @@ message DataExtractionNotification { optional uint64 timestamp = 2; } -// message GroupInviteMessage { -// required string name = 1; -// required bytes memberPrivateKey = 2; -// } - -// this will replace our closedGroupControlMessage but we will need to keep both for some time -// message GroupMessage { - // optional GroupAdminMessage adminMessage = 31; - // optional GroupMemberLeftMessage memberLeftMessage = 32; - // optional GroupInviteMessage inviteMessage = 33; - // optional GroupPromoteMessage promoteMessage = 34; -// } - -// message GroupPromoteMessage { - // required bytes privateKey = 1; // this is the group admins key -// } - -// message GroupAdminMessage { - // enum Type { - // DELETE_GROUP = 1; // members, groupSignature - // DELETE_GROUP_ALL_MEMBERS = 2; // groupSignature - // DELETE_MESSAGES_ALL_MEMBERS = 3; // groupSignature - // DELETE_ATTACHMENTS_ALL_MEMBERS = 4; // groupSignature - // } -// - // // @required - // required Type type = 1; - // repeated bytes members = 2; +message GroupUpdateInviteMessage { // @required - // required bytes groupSignature = 3; // used by every members to make sure incoming admin action can be trusted -// } + required bytes groupIdentityPublicKey = 1; + // @required + required string name = 2; + // @required + required bytes memberSubkey = 3; + // @required + required bytes memberTag = 4; + optional bytes profileKey = 5; + optional LokiProfile profile = 6; +} + +message GroupUpdateDeleteMessage { + // @required + required bytes groupIdentityPublicKey = 1; + // @required + required bytes encryptedMemberSubkey = 2; +} + +message GroupUpdateInfoChangeMessage { + enum Type { + NAME = 1; + AVATAR = 2; + DISAPPEARING_MESSAGES = 3; + } + + // @required + required Type type = 1; + optional string updatedName = 2; + optional uint32 updatedExpiration = 3; +} + +message GroupUpdateMemberChangeMessage { + enum Type { + ADDED = 1; + REMOVED = 2; + PROMOTED = 3; + } + + // @required + required Type type = 1; + repeated bytes memberPublicKeys = 2; +} + +message GroupUpdatePromoteMessage { + // @required + required bytes memberPublicKey = 1; + // @required + required bytes encryptedGroupIdentityPrivateKey = 2; +} + +message GroupUpdateMemberLeftMessage { + // the pubkey of the member left is included as part of the closed group encryption logic (senderIdentity on desktop) +} + +message GroupUpdateInviteResponseMessage { + // @required + required bool isApproved = 1; // Whether the request was approved + optional bytes profileKey = 2; + optional LokiProfile profile = 3; +} + +message GroupUpdatePromotionResponseMessage { + // @required + required bytes encryptedMemberPublicKey = 1; +} + +message GroupUpdateDeleteMemberContentMessage { + repeated bytes memberPublicKeys = 2; +} + +message GroupUpdateMessage { + optional GroupUpdateInviteMessage inviteMessage = 31; + optional GroupUpdateDeleteMessage deleteMessage = 32; + optional GroupUpdateInfoChangeMessage infoChangeMessage = 33; + optional GroupUpdateMemberChangeMessage memberChangeMessage = 34; + optional GroupUpdatePromoteMessage promoteMessage = 35; + optional GroupUpdateMemberLeftMessage memberLeftMessage = 36; + optional GroupUpdateInviteResponseMessage inviteResponse = 37; + optional GroupUpdatePromotionResponseMessage promotionResponse = 38; + optional GroupUpdateDeleteMemberContentMessage deleteMemberContent = 39; +} -// message GroupMemberLeftMessage { - // the pubkey of the member who left is already in the senderIdentity -// } message DataMessage { @@ -225,8 +274,7 @@ message DataMessage { optional ClosedGroupControlMessage closedGroupControlMessage = 104; optional string syncTarget = 105; optional bool blocksCommunityMessageRequests = 106; - // optional GroupMessage groupMessage = 120; -} + optional GroupUpdateMessage groupUpdateMessage = 120;} message CallMessage { diff --git a/ts/webworker/workers/browser/libsession_worker_interface.ts b/ts/webworker/workers/browser/libsession_worker_interface.ts index b8e2454b3..5d18b5fdb 100644 --- a/ts/webworker/workers/browser/libsession_worker_interface.ts +++ b/ts/webworker/workers/browser/libsession_worker_interface.ts @@ -13,6 +13,7 @@ import { ProfilePicture, UserConfigWrapperActionsCalls, UserGroupsWrapperActionsCalls, + UserGroupsSet, } from 'libsession_util_nodejs'; import { join } from 'path'; @@ -264,6 +265,21 @@ export const UserGroupsWrapperActions: UserGroupsWrapperActionsCalls = { callLibSessionWorker(['UserGroupsConfig', 'getGroup', pubkeyHex]) as Promise< ReturnType >, + + getAllGroups: async () => + callLibSessionWorker(['UserGroupsConfig', 'getAllGroups']) as Promise< + ReturnType + >, + + setGroup: async (info: UserGroupsSet) => + callLibSessionWorker(['UserGroupsConfig', 'setGroup', info]) as Promise< + ReturnType + >, + + eraseGroup: async (pubkeyHex: GroupPubkeyType) => + callLibSessionWorker(['UserGroupsConfig', 'eraseGroup', pubkeyHex]) as Promise< + ReturnType + >, }; export const ConvoInfoVolatileWrapperActions: ConvoInfoVolatileWrapperActionsCalls = {