diff --git a/js/models/conversations.js b/js/models/conversations.js index 56a914889..f60c1e297 100644 --- a/js/models/conversations.js +++ b/js/models/conversations.js @@ -1908,32 +1908,53 @@ return; } - message.send( - this.wrapSend( - textsecure.messaging.sendGroupUpdate( - this.id, - this.get('name'), - this.get('avatar'), - this.get('members'), - this.get('groupAdmins'), - groupUpdate.recipients, - {} - ) - ) + const updateParams = { + timestamp: Date.now(), + groupId: this.id, + name: this.get('name'), + avatar: this.get('avatar'), + members: this.get('members'), + admins: this.get('groupAdmins'), + }; + const groupUpdateMessage = new libsession.Messages.Outgoing.ClosedGroupUpdateMessage( + updateParams ); + + groupUpdate.recipients.forEach(r => { + const recipientPubKey = new libsession.Types.PubKey(r); + if (!recipientPubKey) { + window.console.warn('updateGroup invalid pubkey:', r); + return; + } + libsession + .getMessageQueue() + .sendUsingMultiDevice(recipientPubKey, groupUpdateMessage) + .ignore(); + }); }, - sendGroupInfo(recipients) { + sendGroupInfo(recipient) { if (this.isClosedGroup()) { - textsecure.messaging.sendGroupUpdate( - this.id, - this.get('name'), - this.get('avatar'), - this.get('members'), - this.get('groupAdmins'), - recipients, - {} + const updateParams = { + timestamp: Date.now(), + groupId: this.id, + name: this.get('name'), + avatar: this.get('avatar'), + members: this.get('members'), + admins: this.get('groupAdmins'), + }; + const groupUpdateMessage = new libsession.Messages.Outgoing.ClosedGroupUpdateMessage( + updateParams ); + const recipientPubKey = new libsession.Types.PubKey(recipient); + if (!recipientPubKey) { + window.console.warn('sendGroupInfo invalid pubkey:', recipient); + return; + } + libsession + .getMessageQueue() + .send(recipientPubKey, groupUpdateMessage) + .ignore(); } }, diff --git a/libtextsecure/sendmessage.js b/libtextsecure/sendmessage.js index f5982cf92..5b87e4cea 100644 --- a/libtextsecure/sendmessage.js +++ b/libtextsecure/sendmessage.js @@ -1078,7 +1078,6 @@ textsecure.MessageSender = function MessageSenderWrapper(username, password) { this.sendMessageToNumber = sender.sendMessageToNumber.bind(sender); this.sendMessage = sender.sendMessage.bind(sender); this.sendMessageToGroup = sender.sendMessageToGroup.bind(sender); - this.sendGroupUpdate = sender.sendGroupUpdate.bind(sender); this.updateMediumGroup = sender.updateMediumGroup.bind(sender); this.addNumberToGroup = sender.addNumberToGroup.bind(sender); this.setGroupName = sender.setGroupName.bind(sender); diff --git a/ts/receiver/groups.ts b/ts/receiver/groups.ts index a7d950c62..62c2dcd9b 100644 --- a/ts/receiver/groups.ts +++ b/ts/receiver/groups.ts @@ -75,7 +75,7 @@ export async function preprocessGroupMessage( window.libloki.api.debug.logGroupRequestInfo( `Received GROUP_TYPES.REQUEST_INFO from source: ${source}, primarySource: ${primarySource}, sending back group info.` ); - conversation.sendGroupInfo([source]); + conversation.sendGroupInfo(source); return true; } diff --git a/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts b/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts index 01cfb9a6f..0b07764a7 100644 --- a/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts +++ b/ts/session/messages/outgoing/content/data/group/ClosedGroupMessage.ts @@ -1,6 +1,5 @@ import { DataMessage } from '../DataMessage'; import { SignalService } from '../../../../../../protobuf'; -import { TextEncoder } from 'util'; import { MessageParams } from '../../../Message'; import { StringUtils } from '../../../../../utils'; @@ -19,6 +18,10 @@ export abstract class ClosedGroupMessage extends DataMessage { this.groupId = params.groupId; } + public ttl(): number { + return this.getDefaultTTL(); + } + protected abstract groupContextType(): SignalService.GroupContext.Type; protected groupContext(): SignalService.GroupContext { diff --git a/ts/session/messages/outgoing/content/data/group/ClosedGroupUpdateMessage.ts b/ts/session/messages/outgoing/content/data/group/ClosedGroupUpdateMessage.ts new file mode 100644 index 000000000..e416394fc --- /dev/null +++ b/ts/session/messages/outgoing/content/data/group/ClosedGroupUpdateMessage.ts @@ -0,0 +1,76 @@ +import { DataMessage } from '../DataMessage'; +import { SignalService } from '../../../../../../protobuf'; +import { StringUtils } from '../../../../../utils'; +import { + ClosedGroupMessage, + ClosedGroupMessageParams, +} from './ClosedGroupMessage'; +import { AttachmentPointer } from '../ChatMessage'; +import { PubKey } from '../../../../../types'; + +export interface ClosedGroupUpdateMessageParams + extends ClosedGroupMessageParams { + name: string; + members?: Array; + admins?: Array; + avatar?: AttachmentPointer; +} + +export abstract class ClosedGroupUpdateMessage extends ClosedGroupMessage { + private readonly name: string; + private readonly members?: Array; + private readonly admins?: Array; + private readonly avatar?: AttachmentPointer; + + constructor(params: ClosedGroupUpdateMessageParams) { + super({ + timestamp: params.timestamp, + identifier: params.identifier, + groupId: params.groupId, + }); + if (typeof params.name !== 'string') { + throw new Error('name must be a string'); + } + if ( + params.members && + params.members.length > 0 && + typeof params.members[0] !== 'string' + ) { + throw new Error('members has not the correct type'); + } + if ( + params.admins && + params.admins.length > 0 && + typeof params.admins[0] !== 'string' + ) { + throw new Error('admins has not the correct type'); + } + + this.name = params.name; + this.members = params.members; + this.admins = params.admins; + this.avatar = params.avatar; + } + + protected groupContextType(): SignalService.GroupContext.Type { + return SignalService.GroupContext.Type.UPDATE; + } + + protected groupContext(): SignalService.GroupContext { + // use the parent method to fill id and type correctly + const groupContext = super.groupContext(); + + if (this.name) { + groupContext.name = this.name; + } + if (this.members && this.members.length > 0) { + groupContext.members = this.members; + } + + if (this.admins && this.admins.length > 0) { + groupContext.admins = this.admins; + } + + return groupContext; + } +} diff --git a/ts/session/messages/outgoing/content/data/group/index.ts b/ts/session/messages/outgoing/content/data/group/index.ts index de23842aa..a5df6dce2 100644 --- a/ts/session/messages/outgoing/content/data/group/index.ts +++ b/ts/session/messages/outgoing/content/data/group/index.ts @@ -1,2 +1,5 @@ export * from './ClosedGroupMessage'; export * from './ClosedGroupChatMessage'; +export * from './ClosedGroupUpdateMessage'; +export * from './ClosedGroupLeaveMessage'; +export * from './ClosedGroupRequestInfoMessage';