feat: move profile details of group invite to use the one in dataMsg

pull/2963/head
Audric Ackermann 2 years ago
parent e2801915ef
commit 6ed74c9807

@ -89,8 +89,6 @@ message GroupUpdateInviteMessage {
// @required // @required
required string name = 2; required string name = 2;
required bytes memberAuthData = 3; required bytes memberAuthData = 3;
optional bytes profileKey = 4;
optional LokiProfile profile = 5;
// @required // @required
required bytes adminSignature = 6; required bytes adminSignature = 6;
} }
@ -140,8 +138,6 @@ message GroupUpdateMemberLeftMessage {
message GroupUpdateInviteResponseMessage { message GroupUpdateInviteResponseMessage {
// @required // @required
required bool isApproved = 1; // Whether the request was approved required bool isApproved = 1; // Whether the request was approved
optional bytes profileKey = 2;
optional LokiProfile profile = 3;
} }

@ -19,12 +19,7 @@ export abstract class GroupUpdateMessage extends DataMessage {
} }
} }
protected abstract updateProto(): SignalService.GroupUpdateMessage; public abstract dataProto(): SignalService.DataMessage;
public dataProto(): SignalService.DataMessage {
const groupUpdateMessage = this.updateProto();
return new SignalService.DataMessage({ groupUpdateMessage });
}
public abstract isFor1o1Swarm(): boolean; public abstract isFor1o1Swarm(): boolean;
public abstract isForGroupSwarm(): boolean; public abstract isForGroupSwarm(): boolean;

@ -25,15 +25,13 @@ export class GroupUpdateDeleteMemberContentMessage extends GroupUpdateMessage {
} }
} }
protected updateProto(): SignalService.GroupUpdateMessage { public dataProto(): SignalService.DataMessage {
const deleteMemberContent = new SignalService.GroupUpdateDeleteMemberContentMessage({ const deleteMemberContent = new SignalService.GroupUpdateDeleteMemberContentMessage({
adminSignature: this.adminSignature, adminSignature: this.adminSignature,
memberSessionIds: this.memberSessionIds, memberSessionIds: this.memberSessionIds,
}); });
return new SignalService.GroupUpdateMessage({ return new SignalService.DataMessage({ groupUpdateMessage: { deleteMemberContent } });
deleteMemberContent,
});
} }
public isForGroupSwarm(): boolean { public isForGroupSwarm(): boolean {

@ -53,7 +53,7 @@ export class GroupUpdateInfoChangeMessage extends GroupUpdateMessage {
} }
} }
protected updateProto(): SignalService.GroupUpdateMessage { public dataProto(): SignalService.DataMessage {
const infoChangeMessage = new SignalService.GroupUpdateInfoChangeMessage({ const infoChangeMessage = new SignalService.GroupUpdateInfoChangeMessage({
type: this.typeOfChange, type: this.typeOfChange,
}); });
@ -66,10 +66,7 @@ export class GroupUpdateInfoChangeMessage extends GroupUpdateMessage {
) { ) {
infoChangeMessage.updatedExpiration = this.updatedExpirationSeconds; infoChangeMessage.updatedExpiration = this.updatedExpirationSeconds;
} }
return new SignalService.DataMessage({ groupUpdateMessage: { infoChangeMessage } });
return new SignalService.GroupUpdateMessage({
infoChangeMessage,
});
} }
public isForGroupSwarm(): boolean { public isForGroupSwarm(): boolean {

@ -18,11 +18,14 @@ export class GroupUpdateInviteResponseMessage extends GroupUpdateMessage {
this.isApproved = params.isApproved; this.isApproved = params.isApproved;
} }
protected updateProto(): SignalService.GroupUpdateMessage { public dataProto(): SignalService.DataMessage {
const ourProfile = getOurProfile(); const ourProfile = getOurProfile();
const inviteResponse = new SignalService.GroupUpdateInviteResponseMessage({ const inviteResponse = new SignalService.GroupUpdateInviteResponseMessage({
isApproved: true, isApproved: true,
});
return new SignalService.DataMessage({
profileKey: ourProfile?.profileKey, profileKey: ourProfile?.profileKey,
profile: ourProfile profile: ourProfile
? { ? {
@ -30,10 +33,7 @@ export class GroupUpdateInviteResponseMessage extends GroupUpdateMessage {
profilePicture: ourProfile.avatarPointer, profilePicture: ourProfile.avatarPointer,
} }
: undefined, : undefined,
}); groupUpdateMessage: { inviteResponse },
return new SignalService.GroupUpdateMessage({
inviteResponse,
}); });
} }

@ -62,15 +62,13 @@ export class GroupUpdateMemberChangeMessage extends GroupUpdateMessage {
} }
} }
protected updateProto(): SignalService.GroupUpdateMessage { public dataProto(): SignalService.DataMessage {
const memberChangeMessage = new SignalService.GroupUpdateMemberChangeMessage({ const memberChangeMessage = new SignalService.GroupUpdateMemberChangeMessage({
type: this.typeOfChange, type: this.typeOfChange,
memberSessionIds: this.memberSessionIds, memberSessionIds: this.memberSessionIds,
}); });
return new SignalService.GroupUpdateMessage({ return new SignalService.DataMessage({ groupUpdateMessage: { memberChangeMessage } });
memberChangeMessage,
});
} }
public isForGroupSwarm(): boolean { public isForGroupSwarm(): boolean {

@ -7,12 +7,10 @@ import { GroupUpdateMessage } from '../GroupUpdateMessage';
* *
*/ */
export class GroupUpdateMemberLeftMessage extends GroupUpdateMessage { export class GroupUpdateMemberLeftMessage extends GroupUpdateMessage {
protected updateProto(): SignalService.GroupUpdateMessage { public dataProto(): SignalService.DataMessage {
const memberLeftMessage = new SignalService.GroupUpdateMemberLeftMessage({}); const memberLeftMessage = new SignalService.GroupUpdateMemberLeftMessage({});
return new SignalService.GroupUpdateMessage({ return new SignalService.DataMessage({ groupUpdateMessage: { memberLeftMessage } });
memberLeftMessage,
});
} }
public isForGroupSwarm(): boolean { public isForGroupSwarm(): boolean {

@ -17,12 +17,13 @@ export class GroupUpdateDeleteMessage extends GroupUpdateMessage {
this.adminSignature = params.adminSignature; this.adminSignature = params.adminSignature;
} }
protected updateProto(): SignalService.GroupUpdateMessage { public dataProto(): SignalService.DataMessage {
const deleteMessage = new SignalService.GroupUpdateDeleteMessage({ const deleteMessage = new SignalService.GroupUpdateDeleteMessage({
groupSessionId: this.groupPk, groupSessionId: this.groupPk,
adminSignature: this.adminSignature, adminSignature: this.adminSignature,
}); });
return new SignalService.GroupUpdateMessage({ deleteMessage });
return new SignalService.DataMessage({ groupUpdateMessage: { deleteMessage } });
} }
public isForGroupSwarm(): boolean { public isForGroupSwarm(): boolean {

@ -1,5 +1,6 @@
import { SignalService } from '../../../../../../protobuf'; import { SignalService } from '../../../../../../protobuf';
import { UserUtils } from '../../../../../utils'; import { UserUtils } from '../../../../../utils';
import { Preconditions } from '../../../preconditions';
import { GroupUpdateMessage, GroupUpdateMessageParams } from '../GroupUpdateMessage'; import { GroupUpdateMessage, GroupUpdateMessageParams } from '../GroupUpdateMessage';
interface Params extends GroupUpdateMessageParams { interface Params extends GroupUpdateMessageParams {
@ -16,31 +17,44 @@ export class GroupUpdateInviteMessage extends GroupUpdateMessage {
public readonly adminSignature: Params['adminSignature']; public readonly adminSignature: Params['adminSignature'];
public readonly memberAuthData: Params['memberAuthData']; public readonly memberAuthData: Params['memberAuthData'];
constructor(params: Params) { constructor({ adminSignature, groupName, memberAuthData, ...others }: Params) {
super({ super({
timestamp: params.timestamp, ...others,
identifier: params.identifier,
groupPk: params.groupPk,
}); });
this.groupName = params.groupName; this.groupName = groupName; // not sure if getting an invite with an empty group name should make us drop an incoming group invite (and the keys associated to it too)
this.adminSignature = params.adminSignature; this.adminSignature = adminSignature;
this.memberAuthData = params.memberAuthData; this.memberAuthData = memberAuthData;
Preconditions.checkUin8tArrayOrThrow(
memberAuthData,
100,
'memberAuthData',
'GroupUpdateInviteMessage'
);
Preconditions.checkUin8tArrayOrThrow(
adminSignature,
32,
'adminSignature',
'GroupUpdateInviteMessage'
);
} }
protected updateProto(): SignalService.GroupUpdateMessage { public dataProto(): SignalService.DataMessage {
const ourProfile = UserUtils.getOurProfile(); const ourProfile = UserUtils.getOurProfile();
const inviteMessage = new SignalService.GroupUpdateInviteMessage({ const inviteMessage = new SignalService.GroupUpdateInviteMessage({
groupSessionId: this.groupPk, groupSessionId: this.groupPk,
name: this.groupName, name: this.groupName,
adminSignature: this.adminSignature, adminSignature: this.adminSignature,
memberAuthData: this.memberAuthData, memberAuthData: this.memberAuthData,
});
return new SignalService.DataMessage({
profile: ourProfile profile: ourProfile
? { displayName: ourProfile.displayName, profilePicture: ourProfile.avatarPointer } ? { displayName: ourProfile.displayName, profilePicture: ourProfile.avatarPointer }
: undefined, : undefined,
profileKey: ourProfile?.profileKey, profileKey: ourProfile?.profileKey,
groupUpdateMessage: { inviteMessage },
}); });
return new SignalService.GroupUpdateMessage({ inviteMessage });
} }
public isForGroupSwarm(): boolean { public isForGroupSwarm(): boolean {

@ -22,12 +22,14 @@ export class GroupUpdatePromoteMessage extends GroupUpdateMessage {
} }
} }
protected updateProto(): SignalService.GroupUpdateMessage { public dataProto(): SignalService.DataMessage {
const promoteMessage = new SignalService.GroupUpdatePromoteMessage({ const promoteMessage = new SignalService.GroupUpdatePromoteMessage({
groupIdentitySeed: this.groupIdentitySeed, groupIdentitySeed: this.groupIdentitySeed,
}); });
return new SignalService.GroupUpdateMessage({ promoteMessage }); return new SignalService.DataMessage({
groupUpdateMessage: { promoteMessage },
});
} }
public isForGroupSwarm(): boolean { public isForGroupSwarm(): boolean {

@ -31,6 +31,7 @@ import {
} from '../apis/snode_api/namespaces'; } from '../apis/snode_api/namespaces';
import { CallMessage } from '../messages/outgoing/controlMessage/CallMessage'; import { CallMessage } from '../messages/outgoing/controlMessage/CallMessage';
import { UnsendMessage } from '../messages/outgoing/controlMessage/UnsendMessage'; import { UnsendMessage } from '../messages/outgoing/controlMessage/UnsendMessage';
import { GroupUpdateInviteMessage } from '../messages/outgoing/controlMessage/group_v2/to_user/GroupUpdateInviteMessage';
import { OpenGroupVisibleMessage } from '../messages/outgoing/visibleMessage/OpenGroupVisibleMessage'; import { OpenGroupVisibleMessage } from '../messages/outgoing/visibleMessage/OpenGroupVisibleMessage';
type ClosedGroupMessageType = type ClosedGroupMessageType =
@ -249,7 +250,11 @@ export class MessageQueue {
pubkey, pubkey,
}: { }: {
pubkey: PubKey; pubkey: PubKey;
message: ClosedGroupNewMessage | CallMessage | ClosedGroupMemberLeftMessage; message:
| ClosedGroupNewMessage
| CallMessage
| ClosedGroupMemberLeftMessage
| GroupUpdateInviteMessage;
namespace: SnodeNamespaces; namespace: SnodeNamespaces;
}): Promise<boolean | number> { }): Promise<boolean | number> {
let rawMessage; let rawMessage;

@ -49,8 +49,15 @@ function overwriteOutgoingTimestampWithNetworkTimestamp(message: { plainTextBuff
const { dataMessage, dataExtractionNotification, typingMessage } = contentDecoded; const { dataMessage, dataExtractionNotification, typingMessage } = contentDecoded;
if (dataMessage && dataMessage.timestamp && toNumber(dataMessage.timestamp) > 0) { if (dataMessage && dataMessage.timestamp && toNumber(dataMessage.timestamp) > 0) {
// this is a sync message, do not overwrite the message timestamp // for a few message types, we cannot override the timestamp when sending it.
if (dataMessage.syncTarget) { // - for a sync message
// - groupv2InviteMessage, groupUpdateDeleteMemberContentMessage, groupUpdateDeleteMessage as the embedded signature depends on the timestamp inside
if (
dataMessage.syncTarget ||
dataMessage.groupUpdateMessage?.inviteMessage ||
dataMessage.groupUpdateMessage?.deleteMemberContent ||
dataMessage.groupUpdateMessage?.deleteMessage
) {
return { return {
overRiddenTimestampBuffer: plainTextBuffer, overRiddenTimestampBuffer: plainTextBuffer,
networkTimestamp: _.toNumber(dataMessage.timestamp), networkTimestamp: _.toNumber(dataMessage.timestamp),

@ -1,4 +1,4 @@
import { GroupPubkeyType } from 'libsession_util_nodejs'; import { GroupPubkeyType, PubkeyType } from 'libsession_util_nodejs';
import { fromHexToArray } from '../utils/String'; import { fromHexToArray } from '../utils/String';
export enum KeyPrefixType { export enum KeyPrefixType {
@ -235,8 +235,14 @@ export class PubKey {
return key.startsWith(KeyPrefixType.blinded15) || key.startsWith(KeyPrefixType.blinded25); return key.startsWith(KeyPrefixType.blinded15) || key.startsWith(KeyPrefixType.blinded25);
} }
// TODO we should probably move those to a libsession exported ts file
public static isClosedGroupV2(key: string): key is GroupPubkeyType { public static isClosedGroupV2(key: string): key is GroupPubkeyType {
const regex = new RegExp(`^${KeyPrefixType.groupV2}${PubKey.HEX}{64}$`); const regex = new RegExp(`^${KeyPrefixType.groupV2}${PubKey.HEX}{64}$`);
return regex.test(key); return regex.test(key);
} }
public static is05Pubkey(key: string): key is PubkeyType {
const regex = new RegExp(`^${KeyPrefixType.standard}${PubKey.HEX}{64}$`);
return regex.test(key);
}
} }

@ -4,6 +4,7 @@ import {
GroupInfoGet, GroupInfoGet,
GroupMemberGet, GroupMemberGet,
GroupPubkeyType, GroupPubkeyType,
PubkeyType,
UserGroupsGet, UserGroupsGet,
} from 'libsession_util_nodejs'; } from 'libsession_util_nodejs';
import { isEmpty, uniq } from 'lodash'; import { isEmpty, uniq } from 'lodash';
@ -11,7 +12,11 @@ import { ConfigDumpData } from '../../data/configDump/configDump';
import { ConversationTypeEnum } from '../../models/conversationAttributes'; import { ConversationTypeEnum } from '../../models/conversationAttributes';
import { HexString } from '../../node/hexStrings'; import { HexString } from '../../node/hexStrings';
import { getSwarmPollingInstance } from '../../session/apis/snode_api'; import { getSwarmPollingInstance } from '../../session/apis/snode_api';
import { SnodeNamespaces } from '../../session/apis/snode_api/namespaces';
import { ConvoHub } from '../../session/conversations'; import { ConvoHub } from '../../session/conversations';
import { getGroupInvitesMessages } from '../../session/crypto/group/groupSignature';
import { getMessageQueue } from '../../session/sending';
import { PubKey } from '../../session/types';
import { UserUtils } from '../../session/utils'; import { UserUtils } from '../../session/utils';
import { getUserED25519KeyPairBytes } from '../../session/utils/User'; import { getUserED25519KeyPairBytes } from '../../session/utils/User';
import { PreConditionFailed } from '../../session/utils/errors'; import { PreConditionFailed } from '../../session/utils/errors';

Loading…
Cancel
Save