Merge pull request #1250 from Bilb/sync-blocked-numbers

pull/1254/head
Audric Ackermann 5 years ago committed by GitHub
commit b34470c215
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -47,15 +47,6 @@
return _.include(groupIds, groupId);
};
storage.addBlockedGroup = groupId => {
const groupIds = storage.get(BLOCKED_GROUPS_ID, []);
if (_.include(groupIds, groupId)) {
return;
}
window.log.info(`adding groupId(${groupId}) to blocked list`);
storage.put(BLOCKED_GROUPS_ID, groupIds.concat(groupId));
};
storage.removeBlockedGroup = groupId => {
const groupIds = storage.get(BLOCKED_GROUPS_ID, []);
if (!_.include(groupIds, groupId)) {

@ -250,9 +250,14 @@
? BlockedNumberController.block(this.id)
: BlockedNumberController.blockGroup(this.id);
await promise;
this.trigger('change');
this.trigger('change', this);
this.messageCollection.forEach(m => m.trigger('change'));
this.updateTextInputState();
if (this.isPrivate()) {
await textsecure.messaging.sendContactSyncMessage([this]);
} else {
await textsecure.messaging.sendGroupSyncMessage([this]);
}
},
async unblock() {
if (!this.id || this.isPublic() || this.isRss()) {
@ -262,9 +267,14 @@
? BlockedNumberController.unblock(this.id)
: BlockedNumberController.unblockGroup(this.id);
await promise;
this.trigger('change');
this.trigger('change', this);
this.messageCollection.forEach(m => m.trigger('change'));
this.updateTextInputState();
if (this.isPrivate()) {
await textsecure.messaging.sendContactSyncMessage([this]);
} else {
await textsecure.messaging.sendGroupSyncMessage([this]);
}
},
setMessageSelectionBackdrop() {
const messageSelected = this.selectedMessages.size > 0;

@ -289,6 +289,7 @@
window.storage.get('primaryDevicePubKey')
),
isKickedFromGroup: this.model.get('isKickedFromGroup'),
isBlocked: this.model.isBlocked(),
timerOptions: Whisper.ExpirationTimerOptions.map(item => ({
name: item.getName(),

@ -653,7 +653,7 @@
const conversations = window.getConversations().models;
await textsecure.messaging.sendGroupSyncMessage(conversations);
await textsecure.messaging.sendOpenGroupsSyncMessage(conversations);
await textsecure.messaging.sendContactSyncMessage(conversations);
await textsecure.messaging.sendContactSyncMessage();
}, 5000);
},
validatePubKeyHex(pubKey) {

@ -360,8 +360,13 @@ MessageSender.prototype = {
});
},
async sendContactSyncMessage() {
const convosToSync = await libsession.Utils.SyncMessageUtils.getSyncContacts();
async sendContactSyncMessage(convos) {
let convosToSync;
if (!convos) {
convosToSync = await libsession.Utils.SyncMessageUtils.getSyncContacts();
} else {
convosToSync = convos;
}
if (convosToSync.size === 0) {
window.console.info('No contacts to sync.');
@ -397,11 +402,7 @@ MessageSender.prototype = {
}
// We only want to sync across closed groups that we haven't left
const sessionGroups = conversations.filter(
c =>
c.isClosedGroup() &&
!c.get('left') &&
!c.isBlocked() &&
!c.isMediumGroup()
c => c.isClosedGroup() && !c.get('left') && !c.isMediumGroup()
);
if (sessionGroups.length === 0) {
window.console.info('No closed group to sync.');

@ -11,7 +11,6 @@ import { ContactName } from './conversation/ContactName';
import { TypingAnimation } from './conversation/TypingAnimation';
import { Colors, LocalizerType } from '../types/Util';
import { SessionButton, SessionButtonColor } from './session/SessionButton';
export type PropsData = {
id: string;
@ -181,11 +180,11 @@ export class ConversationListItem extends React.PureComponent<Props> {
{!isPublic && !isRss && !isMe ? (
<MenuItem onClick={blockHandler}>{blockTitle}</MenuItem>
) : null}
{!isPublic && !isRss && !isMe ? (
{/* {!isPublic && !isRss && !isMe ? (
<MenuItem onClick={onChangeNickname}>
{i18n('changeNickname')}
</MenuItem>
) : null}
) : null} */}
{!isPublic && !isRss && !isMe && hasNickname ? (
<MenuItem onClick={onClearNickname}>{i18n('clearNickname')}</MenuItem>
) : null}

@ -454,7 +454,7 @@ export class ConversationHeader extends React.Component<Props> {
const blockTitle = isBlocked ? i18n('unblockUser') : i18n('blockUser');
const blockHandler = isBlocked ? onUnblockUser : onBlockUser;
const disappearingMessagesMenuItem = !isKickedFromGroup && (
const disappearingMessagesMenuItem = !isKickedFromGroup && !isBlocked && (
<SubMenu title={disappearingTitle}>
{(timerOptions || []).map(item => (
<MenuItem
@ -480,7 +480,7 @@ export class ConversationHeader extends React.Component<Props> {
const resetSessionMenuItem = !isGroup && (
<MenuItem onClick={onResetSession}>{i18n('resetSession')}</MenuItem>
);
const blockHandlerMenuItem = !isMe && !isGroup && !isRss && (
const blockHandlerMenuItem = !isMe && !isRss && (
<MenuItem onClick={blockHandler}>{blockTitle}</MenuItem>
);

@ -22,6 +22,7 @@ interface Props {
isAdmin: boolean;
amMod: boolean;
isKickedFromGroup: boolean;
isBlocked: boolean;
onGoBack: () => void;
onInviteContacts: () => void;
@ -215,10 +216,12 @@ export class SessionGroupSettings extends React.Component<Props, any> {
isAdmin,
isKickedFromGroup,
amMod,
isBlocked,
} = this.props;
const { documents, media, onItemClick } = this.state;
const showMemberCount = !!(memberCount && memberCount > 0);
const hasDisappearingMessages = !isPublic && !isKickedFromGroup;
const hasDisappearingMessages =
!isPublic && !isKickedFromGroup && !isBlocked;
const leaveGroupString = isPublic
? window.i18n('leaveOpenGroup')
: isKickedFromGroup
@ -235,9 +238,11 @@ export class SessionGroupSettings extends React.Component<Props, any> {
});
const showUpdateGroupNameButton =
isPublic && !isKickedFromGroup ? amMod : isAdmin;
isPublic && !isKickedFromGroup
? amMod && !isBlocked
: isAdmin && !isBlocked;
const showUpdateGroupMembersButton =
!isPublic && !isKickedFromGroup && isAdmin;
!isPublic && !isKickedFromGroup && !isBlocked && isAdmin;
return (
<div className="group-settings">
@ -313,9 +318,11 @@ export class SessionGroupSettings extends React.Component<Props, any> {
isAdmin,
isPublic,
isKickedFromGroup,
isBlocked,
} = this.props;
const showInviteContacts = (isPublic || isAdmin) && !isKickedFromGroup;
const showInviteContacts =
(isPublic || isAdmin) && !isKickedFromGroup && !isBlocked;
return (
<div className="group-settings-header">

@ -146,13 +146,7 @@ interface GroupInfo {
}
export async function onGroupReceived(details: GroupInfo) {
const {
ConversationController,
libloki,
storage,
textsecure,
Whisper,
} = window;
const { ConversationController, libloki, textsecure, Whisper } = window;
const { id } = details;
@ -189,12 +183,6 @@ export async function onGroupReceived(details: GroupInfo) {
updates.left = true;
}
if (details.blocked) {
storage.addBlockedGroup(id);
} else {
storage.removeBlockedGroup(id);
}
conversation.set(updates);
// Update the conversation avatar only if new avatar exists and hash differs
@ -210,6 +198,13 @@ export async function onGroupReceived(details: GroupInfo) {
);
conversation.set(newAttributes);
}
const isBlocked = details.blocked || false;
if (conversation.isClosedGroup()) {
await BlockedNumberController.setGroupBlocked(conversation.id, isBlocked);
}
conversation.trigger('change', conversation);
conversation.updateTextInputState();
await window.Signal.Data.updateConversation(id, conversation.attributes, {
Conversation: Whisper.Conversation,

@ -12,6 +12,7 @@ import { MultiDeviceProtocol, SessionProtocol } from '../session/protocols';
import { PubKey } from '../session/types';
import ByteBuffer from 'bytebuffer';
import { BlockedNumberController } from '../util';
async function unpairingRequestIsLegit(source: string, ourPubKey: string) {
const { textsecure, storage, lokiFileServerAPI } = window;
@ -287,6 +288,7 @@ export async function handleContacts(
await removeFromCache(envelope);
}
// tslint:disable-next-line: max-func-body-length
async function onContactReceived(details: any) {
const {
ConversationController,
@ -427,7 +429,15 @@ async function onContactReceived(details: any) {
verifiedEvent.viaContactSync = true;
await onVerified(verifiedEvent);
}
await conversation.trigger('change');
const isBlocked = details.blocked || false;
if (conversation.isPrivate()) {
await BlockedNumberController.setBlocked(conversation.id, isBlocked);
}
conversation.updateTextInputState();
await conversation.trigger('change', conversation);
} catch (error) {
window.log.error('onContactReceived error:', Errors.toLogFormat(error));
}

@ -54,6 +54,7 @@ export type ConversationType = {
isTyping: boolean;
isSecondary?: boolean;
primaryDevice: string;
isBlocked: boolean;
};
export type ConversationLookupType = {
[key: string]: ConversationType;

@ -11,6 +11,7 @@ import {
import { getIntl, getRegionCode, getUserNumber } from './user';
import { PropsData as ConversationListItemPropsType } from '../../components/ConversationListItem';
import { BlockedNumberController } from '../../util';
export const getConversations = (state: StateType): ConversationsStateType =>
state.conversations;
@ -119,6 +120,16 @@ export const _getLeftPaneLists = (
isSelected: true,
};
}
const isBlocked =
BlockedNumberController.isBlocked(conversation.primaryDevice) ||
BlockedNumberController.isGroupBlocked(conversation.id);
if (isBlocked) {
conversation = {
...conversation,
isBlocked: true,
};
}
// Add Open Group to list as soon as the name has been set
if (

@ -29,6 +29,7 @@ describe('state/selectors/conversations', () => {
mentionedUs: false,
isSelected: false,
isTyping: false,
isBlocked: false,
},
id2: {
id: 'id2',
@ -47,6 +48,7 @@ describe('state/selectors/conversations', () => {
mentionedUs: false,
isSelected: false,
isTyping: false,
isBlocked: false,
},
id3: {
id: 'id3',
@ -65,6 +67,7 @@ describe('state/selectors/conversations', () => {
mentionedUs: false,
isSelected: false,
isTyping: false,
isBlocked: false,
},
id4: {
id: 'id4',
@ -83,6 +86,7 @@ describe('state/selectors/conversations', () => {
mentionedUs: false,
isSelected: false,
isTyping: false,
isBlocked: false,
},
id5: {
id: 'id5',
@ -101,6 +105,7 @@ describe('state/selectors/conversations', () => {
mentionedUs: false,
isSelected: false,
isTyping: false,
isBlocked: false,
},
};
const comparator = _getConversationComparator(i18n, regionCode);

@ -89,6 +89,26 @@ export class BlockedNumberController {
}
}
public static async setBlocked(
user: string | PubKey,
blocked: boolean
): Promise<void> {
if (blocked) {
return BlockedNumberController.block(user);
}
return BlockedNumberController.unblock(user);
}
public static async setGroupBlocked(
groupId: string | PubKey,
blocked: boolean
): Promise<void> {
if (blocked) {
return BlockedNumberController.blockGroup(groupId);
}
return BlockedNumberController.unblockGroup(groupId);
}
public static async blockGroup(groupId: string | PubKey): Promise<void> {
await this.load();
const id = PubKey.cast(groupId);

Loading…
Cancel
Save