Added support for group request info

pull/877/head
Mikunj 5 years ago
parent d20d31b574
commit fc6ca57e1e

@ -787,6 +787,7 @@
'group' 'group'
); );
convo.updateGroupAdmins([primaryDeviceKey]);
convo.updateGroup(ev.groupDetails); convo.updateGroup(ev.groupDetails);
// Group conversations are automatically 'friends' // Group conversations are automatically 'friends'
@ -795,8 +796,6 @@
window.friends.friendRequestStatusEnum.friends window.friends.friendRequestStatusEnum.friends
); );
convo.updateGroupAdmins([primaryDeviceKey]);
appView.openConversation(groupId, {}); appView.openConversation(groupId, {});
}; };

@ -2232,6 +2232,7 @@
this.get('name'), this.get('name'),
this.get('avatar'), this.get('avatar'),
this.get('members'), this.get('members'),
this.get('groupAdmins'),
groupUpdate.recipients, groupUpdate.recipients,
options options
) )
@ -2239,6 +2240,21 @@
); );
}, },
sendGroupInfo(recipients) {
if (this.isClosedGroup()) {
const options = this.getSendOptions();
textsecure.messaging.updateGroup(
this.id,
this.get('name'),
this.get('avatar'),
this.get('members'),
this.get('groupAdmins'),
recipients,
options
);
}
},
async leaveGroup() { async leaveGroup() {
const now = Date.now(); const now = Date.now();
if (this.get('type') === 'group') { if (this.get('type') === 'group') {
@ -2323,6 +2339,7 @@
const ourNumber = textsecure.storage.user.getNumber(); const ourNumber = textsecure.storage.user.getNumber();
return !stillUnread.some( return !stillUnread.some(
m => m =>
m.propsForMessage &&
m.propsForMessage.text && m.propsForMessage.text &&
m.propsForMessage.text.indexOf(`@${ourNumber}`) !== -1 m.propsForMessage.text.indexOf(`@${ourNumber}`) !== -1
); );

@ -1929,78 +1929,90 @@
} }
} }
if ( if (initialMessage.group) {
initialMessage.group && if (
initialMessage.group.members && initialMessage.group.type === GROUP_TYPES.REQUEST_INFO &&
initialMessage.group.type === GROUP_TYPES.UPDATE !newGroup
) { ) {
if (newGroup) { conversation.sendGroupInfo([source]);
conversation.updateGroupAdmins(initialMessage.group.admins); return null;
} else if (
initialMessage.group.members &&
initialMessage.group.type === GROUP_TYPES.UPDATE
) {
if (newGroup) {
conversation.updateGroupAdmins(initialMessage.group.admins);
conversation.setFriendRequestStatus( conversation.setFriendRequestStatus(
window.friends.friendRequestStatusEnum.friends window.friends.friendRequestStatusEnum.friends
); );
} }
const fromAdmin = conversation const fromAdmin = conversation
.get('groupAdmins') .get('groupAdmins')
.includes(primarySource); .includes(primarySource);
if (!fromAdmin) { if (!fromAdmin) {
// Make sure the message is not removing members / renaming the group // Make sure the message is not removing members / renaming the group
const nameChanged = const nameChanged =
conversation.get('name') !== initialMessage.group.name; conversation.get('name') !== initialMessage.group.name;
if (nameChanged) { if (nameChanged) {
window.log.warn( window.log.warn(
'Non-admin attempts to change the name of the group' 'Non-admin attempts to change the name of the group'
); );
} }
const membersMissing = const membersMissing =
_.difference( _.difference(
conversation.get('members'), conversation.get('members'),
initialMessage.group.members initialMessage.group.members
).length > 0; ).length > 0;
if (membersMissing) { if (membersMissing) {
window.log.warn('Non-admin attempts to remove group members'); window.log.warn('Non-admin attempts to remove group members');
} }
const messageAllowed = !nameChanged && !membersMissing; const messageAllowed = !nameChanged && !membersMissing;
if (!messageAllowed) { if (!messageAllowed) {
confirm(); confirm();
return null; return null;
}
} }
} // For every member, see if we need to establish a session:
// For every member, see if we need to establish a session: initialMessage.group.members.forEach(memberPubKey => {
initialMessage.group.members.forEach(memberPubKey => { const haveSession = _.some(
const haveSession = _.some( textsecure.storage.protocol.sessions,
textsecure.storage.protocol.sessions, s => s.number === memberPubKey
s => s.number === memberPubKey );
);
const ourPubKey = textsecure.storage.user.getNumber(); const ourPubKey = textsecure.storage.user.getNumber();
if (!haveSession && memberPubKey !== ourPubKey) { if (!haveSession && memberPubKey !== ourPubKey) {
ConversationController.getOrCreateAndWait( ConversationController.getOrCreateAndWait(
memberPubKey,
'private'
).then(() => {
textsecure.messaging.sendMessageToNumber(
memberPubKey, memberPubKey,
'(If you see this message, you must be using an out-of-date client)', 'private'
[], ).then(() => {
undefined, textsecure.messaging.sendMessageToNumber(
[], memberPubKey,
Date.now(), '(If you see this message, you must be using an out-of-date client)',
undefined, [],
undefined, undefined,
{ messageType: 'friend-request', sessionRequest: true } [],
); Date.now(),
}); undefined,
} undefined,
}); { messageType: 'friend-request', sessionRequest: true }
);
});
}
});
} else if (newGroup) {
// We have an unknown group, we should request info
textsecure.messaging.requestGroupInfo(conversationId, [
primarySource,
]);
}
} }
const isSessionRequest = const isSessionRequest =

@ -1786,6 +1786,10 @@ MessageReceiver.prototype.extend({
decrypted.group.members = []; decrypted.group.members = [];
decrypted.group.avatar = null; decrypted.group.avatar = null;
break; break;
case textsecure.protobuf.GroupContext.Type.REQUEST_INFO:
decrypted.body = null;
decrypted.attachments = [];
break;
default: default:
this.removeFromCache(envelope); this.removeFromCache(envelope);
throw new Error('Unknown group message type'); throw new Error('Unknown group message type');

@ -1107,7 +1107,7 @@ MessageSender.prototype = {
return this.sendMessage(attrs, options); return this.sendMessage(attrs, options);
}, },
updateGroup(groupId, name, avatar, members, recipients, options) { updateGroup(groupId, name, avatar, members, admins, recipients, options) {
const proto = new textsecure.protobuf.DataMessage(); const proto = new textsecure.protobuf.DataMessage();
proto.group = new textsecure.protobuf.GroupContext(); proto.group = new textsecure.protobuf.GroupContext();
@ -1164,6 +1164,14 @@ MessageSender.prototype = {
}); });
}, },
requestGroupInfo(groupId, groupNumbers, options) {
const proto = new textsecure.protobuf.DataMessage();
proto.group = new textsecure.protobuf.GroupContext();
proto.group.id = stringToArrayBuffer(groupId);
proto.group.type = textsecure.protobuf.GroupContext.Type.REQUEST_INFO;
return this.sendGroupProto(groupNumbers, proto, Date.now(), options);
},
leaveGroup(groupId, groupNumbers, options) { leaveGroup(groupId, groupNumbers, options) {
const proto = new textsecure.protobuf.DataMessage(); const proto = new textsecure.protobuf.DataMessage();
proto.group = new textsecure.protobuf.GroupContext(); proto.group = new textsecure.protobuf.GroupContext();
@ -1263,6 +1271,7 @@ textsecure.MessageSender = function MessageSenderWrapper(username, password) {
this.addNumberToGroup = sender.addNumberToGroup.bind(sender); this.addNumberToGroup = sender.addNumberToGroup.bind(sender);
this.setGroupName = sender.setGroupName.bind(sender); this.setGroupName = sender.setGroupName.bind(sender);
this.setGroupAvatar = sender.setGroupAvatar.bind(sender); this.setGroupAvatar = sender.setGroupAvatar.bind(sender);
this.requestGroupInfo = sender.requestGroupInfo.bind(sender);
this.leaveGroup = sender.leaveGroup.bind(sender); this.leaveGroup = sender.leaveGroup.bind(sender);
this.sendSyncMessage = sender.sendSyncMessage.bind(sender); this.sendSyncMessage = sender.sendSyncMessage.bind(sender);
this.getProfile = sender.getProfile.bind(sender); this.getProfile = sender.getProfile.bind(sender);

Loading…
Cancel
Save