chore: resolve compilation errors

pull/2963/head
Audric Ackermann 1 year ago
parent 3eac45d534
commit d839ff936d

@ -85,7 +85,7 @@ const handleAcceptConversationRequest = async (convoId: string) => {
await convo.commit(); await convo.commit();
if (convo.isPrivate()) { if (convo.isPrivate()) {
await convo.addOutgoingApprovalMessage(Date.now()); await convo.addOutgoingApprovalMessage(Date.now());
await approveConvoAndSendResponse(convoId, true); await approveConvoAndSendResponse(convoId);
} else if (PubKey.is03Pubkey(convoId)) { } else if (PubKey.is03Pubkey(convoId)) {
const found = await UserGroupsWrapperActions.getGroup(convoId); const found = await UserGroupsWrapperActions.getGroup(convoId);
if (!found) { if (!found) {

@ -22,7 +22,6 @@ import {
getSortedMessagesOfSelectedConversation, getSortedMessagesOfSelectedConversation,
} from '../../state/selectors/conversations'; } from '../../state/selectors/conversations';
import { getSelectedConversationKey } from '../../state/selectors/selectedConversation'; import { getSelectedConversationKey } from '../../state/selectors/selectedConversation';
import { ConversationMessageRequestButtons } from './MessageRequestButtons';
import { SessionMessagesList } from './SessionMessagesList'; import { SessionMessagesList } from './SessionMessagesList';
import { TypingBubble } from './TypingBubble'; import { TypingBubble } from './TypingBubble';

@ -2,8 +2,8 @@ import React from 'react';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
import styled from 'styled-components'; import styled from 'styled-components';
import { import {
useConversationUsernameOrShorten,
useIsIncomingRequest, useIsIncomingRequest,
useNicknameOrProfileNameOrShortenedPubkey,
} from '../../hooks/useParamSelector'; } from '../../hooks/useParamSelector';
import { PubKey } from '../../session/types'; import { PubKey } from '../../session/types';
import { import {
@ -106,7 +106,7 @@ export const InvitedToGroupControlMessage = () => {
const groupName = useLibGroupInviteGroupName(selectedConversation) || window.i18n('unknown'); const groupName = useLibGroupInviteGroupName(selectedConversation) || window.i18n('unknown');
const conversationOrigin = useSelectedConversationIdOrigin(); const conversationOrigin = useSelectedConversationIdOrigin();
const adminNameInvitedUs = const adminNameInvitedUs =
useConversationUsernameOrShorten(conversationOrigin) || window.i18n('unknown'); useNicknameOrProfileNameOrShortenedPubkey(conversationOrigin) || window.i18n('unknown');
const isGroupPendingInvite = useLibGroupInvitePending(selectedConversation); const isGroupPendingInvite = useLibGroupInvitePending(selectedConversation);
if ( if (
!selectedConversation || !selectedConversation ||

@ -21,6 +21,7 @@ import { TextWithChildren } from '../basic/Text';
import { ExpirableReadableMessage } from './message/message-item/ExpirableReadableMessage'; import { ExpirableReadableMessage } from './message/message-item/ExpirableReadableMessage';
// eslint-disable-next-line import/order // eslint-disable-next-line import/order
import { ConversationInteraction } from '../../interactions'; import { ConversationInteraction } from '../../interactions';
import { ConvoHub } from '../../session/conversations';
import { updateConfirmModal } from '../../state/ducks/modalDialog'; import { updateConfirmModal } from '../../state/ducks/modalDialog';
import { SessionButtonColor } from '../basic/SessionButton'; import { SessionButtonColor } from '../basic/SessionButton';
import { SessionHtmlRenderer } from '../basic/SessionHTMLRenderer'; import { SessionHtmlRenderer } from '../basic/SessionHTMLRenderer';

@ -13,7 +13,7 @@ import {
useSelectedIsKickedFromGroup, useSelectedIsKickedFromGroup,
useSelectedIsNoteToSelf, useSelectedIsNoteToSelf,
useSelectedIsPublic, useSelectedIsPublic,
useSelectedMembers, useSelectedMembersCount,
useSelectedNicknameOrProfileNameOrShortenedPubkey, useSelectedNicknameOrProfileNameOrShortenedPubkey,
useSelectedNotificationSetting, useSelectedNotificationSetting,
useSelectedSubscriberCount, useSelectedSubscriberCount,
@ -44,14 +44,13 @@ export const ConversationHeaderTitle = () => {
const isKickedFromGroup = useSelectedIsKickedFromGroup(); const isKickedFromGroup = useSelectedIsKickedFromGroup();
const isMe = useSelectedIsNoteToSelf(); const isMe = useSelectedIsNoteToSelf();
const isGroup = useSelectedIsGroup(); const isGroup = useSelectedIsGroup();
const members = useSelectedMembers(); const selectedMembersCount = useSelectedMembersCount();
const expirationMode = useSelectedConversationDisappearingMode(); const expirationMode = useSelectedConversationDisappearingMode();
const expireTimer = useSelectedExpireTimer(); const expireTimer = useSelectedExpireTimer();
const [visibleSubtitle, setVisibleSubtitle] = useState<SubtitleStringsType>( const [visibleSubtitle, setVisibleSubtitle] =
'disappearingMessages' useState<SubtitleStringsType>('disappearingMessages');
);
const [subtitleStrings, setSubtitleStrings] = useState<SubtitleStrings>({}); const [subtitleStrings, setSubtitleStrings] = useState<SubtitleStrings>({});
const [subtitleArray, setSubtitleArray] = useState<Array<SubtitleStringsType>>([]); const [subtitleArray, setSubtitleArray] = useState<Array<SubtitleStringsType>>([]);
@ -69,7 +68,7 @@ export const ConversationHeaderTitle = () => {
if (isPublic) { if (isPublic) {
memberCount = subscriberCount || 0; memberCount = subscriberCount || 0;
} else { } else {
memberCount = members.length; memberCount = selectedMembersCount;
} }
} }
@ -79,7 +78,7 @@ export const ConversationHeaderTitle = () => {
} }
return null; return null;
}, [i18n, isGroup, isKickedFromGroup, isPublic, members.length, subscriberCount]); }, [i18n, isGroup, isKickedFromGroup, isPublic, selectedMembersCount, subscriberCount]);
// TODO legacy messages support will be removed in a future release // TODO legacy messages support will be removed in a future release
// NOTE If disappearing messages is defined we must show it first // NOTE If disappearing messages is defined we must show it first
@ -88,12 +87,12 @@ export const ConversationHeaderTitle = () => {
expirationMode === 'deleteAfterRead' expirationMode === 'deleteAfterRead'
? window.i18n('disappearingMessagesModeAfterRead') ? window.i18n('disappearingMessagesModeAfterRead')
: expirationMode === 'deleteAfterSend' : expirationMode === 'deleteAfterSend'
? window.i18n('disappearingMessagesModeAfterSend')
: expirationMode === 'legacy'
? isMe || (isGroup && !isPublic)
? window.i18n('disappearingMessagesModeAfterSend') ? window.i18n('disappearingMessagesModeAfterSend')
: window.i18n('disappearingMessagesModeAfterRead') : expirationMode === 'legacy'
: null; ? isMe || (isGroup && !isPublic)
? window.i18n('disappearingMessagesModeAfterSend')
: window.i18n('disappearingMessagesModeAfterRead')
: null;
const abbreviatedExpireTime = isNumber(expireTimer) const abbreviatedExpireTime = isNumber(expireTimer)
? TimerOptions.getAbbreviated(expireTimer) ? TimerOptions.getAbbreviated(expireTimer)

@ -1,5 +1,5 @@
import { isEqual } from 'lodash'; import { isEqual } from 'lodash';
import React, { ReactElement, useState } from 'react'; import React, { useState } from 'react';
import useMount from 'react-use/lib/useMount'; import useMount from 'react-use/lib/useMount';
import styled from 'styled-components'; import styled from 'styled-components';
@ -53,7 +53,7 @@ const ReactButton = styled.span`
} }
`; `;
export const MessageReactBar = (props: Props): ReactElement => { export const MessageReactBar = (props: Props) => {
const { action, additionalAction } = props; const { action, additionalAction } = props;
const [recentReactions, setRecentReactions] = useState<RecentReactions>(); const [recentReactions, setRecentReactions] = useState<RecentReactions>();

@ -1,8 +1,9 @@
import { isEmpty, isEqual } from 'lodash'; import { isEmpty, isEqual } from 'lodash';
import React, { ReactElement, useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import styled from 'styled-components'; import styled from 'styled-components';
import { useMessageReactsPropsById } from '../../../../hooks/useParamSelector'; import { useMessageReactsPropsById } from '../../../../hooks/useParamSelector';
import { MessageRenderingProps } from '../../../../models/messageType'; import { MessageRenderingProps } from '../../../../models/messageType';
import { REACT_LIMIT } from '../../../../session/constants';
import { useSelectedIsGroup } from '../../../../state/selectors/selectedConversation'; import { useSelectedIsGroup } from '../../../../state/selectors/selectedConversation';
import { SortedReactionList } from '../../../../types/Reaction'; import { SortedReactionList } from '../../../../types/Reaction';
import { nativeEmojiData } from '../../../../util/emoji'; import { nativeEmojiData } from '../../../../util/emoji';
@ -10,7 +11,6 @@ import { Flex } from '../../../basic/Flex';
import { SessionIcon } from '../../../icon'; import { SessionIcon } from '../../../icon';
import { Reaction, ReactionProps } from '../reactions/Reaction'; import { Reaction, ReactionProps } from '../reactions/Reaction';
import { StyledPopupContainer } from '../reactions/ReactionPopup'; import { StyledPopupContainer } from '../reactions/ReactionPopup';
import { REACT_LIMIT } from '../../../../session/constants';
export const popupXDefault = -81; export const popupXDefault = -81;
export const popupYDefault = -90; export const popupYDefault = -90;
@ -65,7 +65,7 @@ const StyledReadLess = styled.span`
type ReactionsProps = Omit<ReactionProps, 'emoji'>; type ReactionsProps = Omit<ReactionProps, 'emoji'>;
const Reactions = (props: ReactionsProps): ReactElement => { const Reactions = (props: ReactionsProps) => {
const { messageId, reactions, inModal } = props; const { messageId, reactions, inModal } = props;
return ( return (
<StyledMessageReactions <StyledMessageReactions
@ -85,7 +85,7 @@ interface ExpandReactionsProps extends ReactionsProps {
handleExpand: () => void; handleExpand: () => void;
} }
const CompressedReactions = (props: ExpandReactionsProps): ReactElement => { const CompressedReactions = (props: ExpandReactionsProps) => {
const { messageId, reactions, inModal, handleExpand } = props; const { messageId, reactions, inModal, handleExpand } = props;
return ( return (
<StyledMessageReactions <StyledMessageReactions
@ -119,7 +119,7 @@ const CompressedReactions = (props: ExpandReactionsProps): ReactElement => {
); );
}; };
const ExpandedReactions = (props: ExpandReactionsProps): ReactElement => { const ExpandedReactions = (props: ExpandReactionsProps) => {
const { handleExpand } = props; const { handleExpand } = props;
return ( return (
<Flex container={true} flexDirection={'column'} alignItems={'center'} margin="4px 0 0"> <Flex container={true} flexDirection={'column'} alignItems={'center'} margin="4px 0 0">

@ -5,6 +5,7 @@ import styled from 'styled-components';
import { Data } from '../../../../data/data'; import { Data } from '../../../../data/data';
import { useMessageExpirationPropsById } from '../../../../hooks/useParamSelector'; import { useMessageExpirationPropsById } from '../../../../hooks/useParamSelector';
import { MessageModelType } from '../../../../models/messageType'; import { MessageModelType } from '../../../../models/messageType';
import { ConvoHub } from '../../../../session/conversations';
import { PropsForExpiringMessage, messagesExpired } from '../../../../state/ducks/conversations'; import { PropsForExpiringMessage, messagesExpired } from '../../../../state/ducks/conversations';
import { getIncrement } from '../../../../util/timer'; import { getIncrement } from '../../../../util/timer';
import { ExpireTimer } from '../../ExpireTimer'; import { ExpireTimer } from '../../ExpireTimer';

@ -1,4 +1,4 @@
import React, { ReactElement, useRef, useState } from 'react'; import React, { useRef, useState } from 'react';
import { useMouse } from 'react-use'; import { useMouse } from 'react-use';
import styled from 'styled-components'; import styled from 'styled-components';
import { isUsAnySogsFromCache } from '../../../../session/apis/open_group_api/sogsv3/knownBlindedkeys'; import { isUsAnySogsFromCache } from '../../../../session/apis/open_group_api/sogsv3/knownBlindedkeys';
@ -53,7 +53,7 @@ export type ReactionProps = {
handlePopupClick?: () => void; handlePopupClick?: () => void;
}; };
export const Reaction = (props: ReactionProps): ReactElement => { export const Reaction = (props: ReactionProps) => {
const { const {
emoji, emoji,
messageId, messageId,

@ -1,11 +1,11 @@
import React, { ReactElement, useEffect, useState } from 'react'; import React, { useEffect, useState } from 'react';
import { useSelector } from 'react-redux'; import { useSelector } from 'react-redux';
import styled from 'styled-components'; import styled from 'styled-components';
import { Data } from '../../../../data/data'; import { Data } from '../../../../data/data';
import { findAndFormatContact } from '../../../../models/message';
import { PubKey } from '../../../../session/types/PubKey'; import { PubKey } from '../../../../session/types/PubKey';
import { isDarkTheme } from '../../../../state/selectors/theme'; import { isDarkTheme } from '../../../../state/selectors/theme';
import { nativeEmojiData } from '../../../../util/emoji'; import { nativeEmojiData } from '../../../../util/emoji';
import { findAndFormatContact } from '../../../../models/message';
export type TipPosition = 'center' | 'left' | 'right'; export type TipPosition = 'center' | 'left' | 'right';
@ -142,7 +142,7 @@ type Props = {
onClick: (...args: Array<any>) => void; onClick: (...args: Array<any>) => void;
}; };
export const ReactionPopup = (props: Props): ReactElement => { export const ReactionPopup = (props: Props) => {
const { messageId, emoji, count, senders, tooltipPosition = 'center', onClick } = props; const { messageId, emoji, count, senders, tooltipPosition = 'center', onClick } = props;
const [contacts, setContacts] = useState<Array<string>>([]); const [contacts, setContacts] = useState<Array<string>>([]);

@ -1,6 +1,6 @@
import { useDispatch } from 'react-redux'; import { useDispatch } from 'react-redux';
// eslint-disable-next-line import/no-named-default // eslint-disable-next-line import/no-named-default
import { ChangeEvent, MouseEvent, default as React, ReactElement, useState } from 'react'; import { ChangeEvent, MouseEvent, default as React, useState } from 'react';
import { QRCode } from 'react-qr-svg'; import { QRCode } from 'react-qr-svg';
import styled from 'styled-components'; import styled from 'styled-components';
import { Avatar, AvatarSize } from '../avatar/Avatar'; import { Avatar, AvatarSize } from '../avatar/Avatar';
@ -69,7 +69,7 @@ type ProfileAvatarProps = {
ourId: string; ourId: string;
}; };
export const ProfileAvatar = (props: ProfileAvatarProps): ReactElement => { export const ProfileAvatar = (props: ProfileAvatarProps) => {
const { newAvatarObjectUrl, avatarPath, profileName, ourId } = props; const { newAvatarObjectUrl, avatarPath, profileName, ourId } = props;
return ( return (
<Avatar <Avatar
@ -86,7 +86,7 @@ type ProfileHeaderProps = ProfileAvatarProps & {
setMode: (mode: ProfileDialogModes) => void; setMode: (mode: ProfileDialogModes) => void;
}; };
const ProfileHeader = (props: ProfileHeaderProps): ReactElement => { const ProfileHeader = (props: ProfileHeaderProps) => {
const { avatarPath, profileName, ourId, onClick, setMode } = props; const { avatarPath, profileName, ourId, onClick, setMode } = props;
return ( return (
@ -114,7 +114,7 @@ const ProfileHeader = (props: ProfileHeaderProps): ReactElement => {
}; };
type ProfileDialogModes = 'default' | 'edit' | 'qr'; type ProfileDialogModes = 'default' | 'edit' | 'qr';
export const EditProfileDialog = (): ReactElement => { export const EditProfileDialog = () => {
const dispatch = useDispatch(); const dispatch = useDispatch();
const _profileName = useOurConversationUsername() || ''; const _profileName = useOurConversationUsername() || '';

@ -1,14 +1,14 @@
import React, { ReactElement, useState } from 'react'; import React, { useState } from 'react';
import { useDispatch } from 'react-redux'; import { useDispatch } from 'react-redux';
import styled from 'styled-components'; import styled from 'styled-components';
import { useMessageReactsPropsById } from '../../hooks/useParamSelector'; import { useMessageReactsPropsById } from '../../hooks/useParamSelector';
import { clearSogsReactionByServerId } from '../../session/apis/open_group_api/sogsv3/sogsV3ClearReaction'; import { clearSogsReactionByServerId } from '../../session/apis/open_group_api/sogsv3/sogsV3ClearReaction';
import { ConvoHub } from '../../session/conversations'; import { ConvoHub } from '../../session/conversations';
import { updateReactClearAllModal } from '../../state/ducks/modalDialog'; import { updateReactClearAllModal } from '../../state/ducks/modalDialog';
import { SessionWrapperModal } from '../SessionWrapperModal';
import { Flex } from '../basic/Flex'; import { Flex } from '../basic/Flex';
import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton'; import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
import { SessionSpinner } from '../basic/SessionSpinner'; import { SessionSpinner } from '../basic/SessionSpinner';
import { SessionWrapperModal } from '../SessionWrapperModal';
type Props = { type Props = {
reaction: string; reaction: string;
@ -46,7 +46,7 @@ const StyledReactClearAllContainer = styled(Flex)`
} }
`; `;
export const ReactClearAllModal = (props: Props): ReactElement => { export const ReactClearAllModal = (props: Props) => {
const { reaction, messageId } = props; const { reaction, messageId } = props;
const [clearingInProgress, setClearingInProgress] = useState(false); const [clearingInProgress, setClearingInProgress] = useState(false);

@ -1,9 +1,10 @@
import { isEmpty, isEqual } from 'lodash'; import { isEmpty, isEqual } from 'lodash';
import React, { ReactElement, useEffect, useMemo, useState } from 'react'; import React, { useEffect, useMemo, useState } from 'react';
import { useDispatch } from 'react-redux'; import { useDispatch } from 'react-redux';
import styled from 'styled-components'; import styled from 'styled-components';
import { Data } from '../../data/data'; import { Data } from '../../data/data';
import { useMessageReactsPropsById } from '../../hooks/useParamSelector'; import { useMessageReactsPropsById } from '../../hooks/useParamSelector';
import { findAndFormatContact } from '../../models/message';
import { isUsAnySogsFromCache } from '../../session/apis/open_group_api/sogsv3/knownBlindedkeys'; import { isUsAnySogsFromCache } from '../../session/apis/open_group_api/sogsv3/knownBlindedkeys';
import { UserUtils } from '../../session/utils'; import { UserUtils } from '../../session/utils';
import { import {
@ -18,6 +19,7 @@ import {
import { SortedReactionList } from '../../types/Reaction'; import { SortedReactionList } from '../../types/Reaction';
import { nativeEmojiData } from '../../util/emoji'; import { nativeEmojiData } from '../../util/emoji';
import { Reactions } from '../../util/reactions'; import { Reactions } from '../../util/reactions';
import { SessionWrapperModal } from '../SessionWrapperModal';
import { Avatar, AvatarSize } from '../avatar/Avatar'; import { Avatar, AvatarSize } from '../avatar/Avatar';
import { Flex } from '../basic/Flex'; import { Flex } from '../basic/Flex';
import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton'; import { SessionButton, SessionButtonColor, SessionButtonType } from '../basic/SessionButton';
@ -25,8 +27,6 @@ import { SessionHtmlRenderer } from '../basic/SessionHTMLRenderer';
import { ContactName } from '../conversation/ContactName'; import { ContactName } from '../conversation/ContactName';
import { MessageReactions } from '../conversation/message/message-content/MessageReactions'; import { MessageReactions } from '../conversation/message/message-content/MessageReactions';
import { SessionIconButton } from '../icon'; import { SessionIconButton } from '../icon';
import { SessionWrapperModal } from '../SessionWrapperModal';
import { findAndFormatContact } from '../../models/message';
const StyledReactListContainer = styled(Flex)` const StyledReactListContainer = styled(Flex)`
width: 376px; width: 376px;
@ -218,7 +218,7 @@ const handleSenders = (senders: Array<string>, me: string) => {
return updatedSenders; return updatedSenders;
}; };
export const ReactListModal = (props: Props): ReactElement => { export const ReactListModal = (props: Props) => {
const { reaction, messageId } = props; const { reaction, messageId } = props;
const dispatch = useDispatch(); const dispatch = useDispatch();

@ -906,7 +906,6 @@ export class MessageModel extends Backbone.Model<MessageAttributes> {
identifier: this.id, identifier: this.id,
body, body,
createAtNetworkTimestamp, createAtNetworkTimestamp,
expireTimer: this.get('expireTimer'),
attachments, attachments,
preview: preview ? [preview] : [], preview: preview ? [preview] : [],
quote, quote,
@ -1253,18 +1252,18 @@ export class MessageModel extends Backbone.Model<MessageAttributes> {
const left: Array<string> | undefined = Array.isArray(groupUpdate.left) const left: Array<string> | undefined = Array.isArray(groupUpdate.left)
? groupUpdate.left ? groupUpdate.left
: groupUpdate.left : groupUpdate.left
? [groupUpdate.left] ? [groupUpdate.left]
: undefined; : undefined;
const kicked: Array<string> | undefined = Array.isArray(groupUpdate.kicked) const kicked: Array<string> | undefined = Array.isArray(groupUpdate.kicked)
? groupUpdate.kicked ? groupUpdate.kicked
: groupUpdate.kicked : groupUpdate.kicked
? [groupUpdate.kicked] ? [groupUpdate.kicked]
: undefined; : undefined;
const joined: Array<string> | undefined = Array.isArray(groupUpdate.joined) const joined: Array<string> | undefined = Array.isArray(groupUpdate.joined)
? groupUpdate.joined ? groupUpdate.joined
: groupUpdate.joined : groupUpdate.joined
? [groupUpdate.joined] ? [groupUpdate.joined]
: undefined; : undefined;
const forcedArrayUpdate: MessageGroupUpdate = {}; const forcedArrayUpdate: MessageGroupUpdate = {};

@ -349,7 +349,7 @@ async function deleteContactsFromDB(contactsToRemove: Array<string>) {
} }
} }
async function handleContactsUpdate() { async function handleContactsUpdate(result: IncomingUserResult) {
const us = UserUtils.getOurPubKeyStrFromCache(); const us = UserUtils.getOurPubKeyStrFromCache();
const allContactsInWrapper = await ContactsWrapperActions.getAll(); const allContactsInWrapper = await ContactsWrapperActions.getAll();
@ -407,7 +407,7 @@ async function handleContactsUpdate() {
providedDisappearingMode: wrapperConvo.expirationMode, providedDisappearingMode: wrapperConvo.expirationMode,
providedExpireTimer: wrapperConvo.expirationTimerSeconds, providedExpireTimer: wrapperConvo.expirationTimerSeconds,
providedSource: wrapperConvo.id, providedSource: wrapperConvo.id,
receivedAt: result.latestEnvelopeTimestamp, receivedAt: result.latestEnvelopeTimestamp, // this is most likely incorrect, but that's all we have
fromSync: true, fromSync: true,
fromCurrentDevice: false, fromCurrentDevice: false,
shouldCommitConvo: false, shouldCommitConvo: false,
@ -947,7 +947,7 @@ async function processUserMergingResults(results: Map<ConfigWrapperUser, Incomin
await handleUserProfileUpdate(incomingResult); await handleUserProfileUpdate(incomingResult);
break; break;
case SnodeNamespaces.UserContacts: case SnodeNamespaces.UserContacts:
await handleContactsUpdate(); await handleContactsUpdate(incomingResult);
break; break;
case SnodeNamespaces.UserGroups: case SnodeNamespaces.UserGroups:
await handleUserGroupsUpdate(incomingResult); await handleUserGroupsUpdate(incomingResult);

@ -48,6 +48,8 @@ async function sendInviteResponseToGroup({ groupPk }: { groupPk: GroupPubkeyType
groupPk, groupPk,
isApproved: true, isApproved: true,
createAtNetworkTimestamp: GetNetworkTime.now(), createAtNetworkTimestamp: GetNetworkTime.now(),
expirationType: 'unknown', // TODO audric do we want those not expiring?
expireTimer: 0,
}), }),
}); });
@ -190,12 +192,14 @@ async function handleGroupInfoChangeMessage({
switch (change.type) { switch (change.type) {
case SignalService.GroupUpdateInfoChangeMessage.Type.NAME: { case SignalService.GroupUpdateInfoChangeMessage.Type.NAME: {
await ClosedGroup.addUpdateMessage( await ClosedGroup.addUpdateMessage({
convo, convo,
{ newName: change.updatedName }, diff: { newName: change.updatedName },
author,
envelopeTimestamp sender: author,
); sentAt: envelopeTimestamp,
expireUpdate: null,
});
break; break;
} }
@ -210,7 +214,14 @@ async function handleGroupInfoChangeMessage({
isFinite(change.updatedExpiration) && isFinite(change.updatedExpiration) &&
change.updatedExpiration >= 0 change.updatedExpiration >= 0
) { ) {
await convo.updateExpireTimer(change.updatedExpiration, author, envelopeTimestamp); await convo.updateExpireTimer({
providedExpireTimer: change.updatedExpiration,
providedSource: author,
receivedAt: envelopeTimestamp,
fromCurrentDevice: false,
fromSync: false,
fromConfigMessage: false,
});
} }
break; break;
} }
@ -244,33 +255,29 @@ async function handleGroupMemberChangeMessage({
return; return;
} }
const sharedDetails = { convo, sender: author, sentAt: envelopeTimestamp, expireUpdate: null };
switch (change.type) { switch (change.type) {
case SignalService.GroupUpdateMemberChangeMessage.Type.ADDED: { case SignalService.GroupUpdateMemberChangeMessage.Type.ADDED: {
await ClosedGroup.addUpdateMessage( await ClosedGroup.addUpdateMessage({
convo, diff: { joiningMembers: change.memberSessionIds },
{ joiningMembers: change.memberSessionIds }, ...sharedDetails,
author, });
envelopeTimestamp
);
break; break;
} }
case SignalService.GroupUpdateMemberChangeMessage.Type.REMOVED: { case SignalService.GroupUpdateMemberChangeMessage.Type.REMOVED: {
await ClosedGroup.addUpdateMessage( await ClosedGroup.addUpdateMessage({
convo, diff: { kickedMembers: change.memberSessionIds },
{ kickedMembers: change.memberSessionIds }, ...sharedDetails,
author, });
envelopeTimestamp
);
break; break;
} }
case SignalService.GroupUpdateMemberChangeMessage.Type.PROMOTED: { case SignalService.GroupUpdateMemberChangeMessage.Type.PROMOTED: {
await ClosedGroup.addUpdateMessage( await ClosedGroup.addUpdateMessage({
convo, diff: { promotedMembers: change.memberSessionIds },
{ promotedMembers: change.memberSessionIds }, ...sharedDetails,
author, });
envelopeTimestamp
);
break; break;
} }
default: default:
@ -293,12 +300,13 @@ async function handleGroupMemberLeftMessage({
return; return;
} }
await ClosedGroup.addUpdateMessage( await ClosedGroup.addUpdateMessage({
convo, convo,
{ leavingMembers: [author] }, diff: { leavingMembers: [author] },
author, sender: author,
envelopeTimestamp sentAt: envelopeTimestamp,
); expireUpdate: null,
});
convo.set({ convo.set({
active_at: envelopeTimestamp, active_at: envelopeTimestamp,
}); });

@ -19,7 +19,7 @@ import { EmptySwarmError } from '../../utils/errors';
import { SeedNodeAPI } from '../seed_node_api'; import { SeedNodeAPI } from '../seed_node_api';
import { import {
MAX_SUBREQUESTS_COUNT, MAX_SUBREQUESTS_COUNT,
UpdateExpiryOnNodeSubRequest, UpdateExpiryOnNodeUserSubRequest,
WithShortenOrExtend, WithShortenOrExtend,
fakeHash, fakeHash,
} from './SnodeRequestTypes'; } from './SnodeRequestTypes';
@ -155,7 +155,7 @@ type UpdatedExpiryWithHash = { messageHash: string; updatedExpiryMs: number };
async function updateExpiryOnNodes( async function updateExpiryOnNodes(
targetNode: Snode, targetNode: Snode,
ourPubKey: string, ourPubKey: string,
expireRequests: Array<UpdateExpiryOnNodeSubRequest> expireRequests: Array<UpdateExpiryOnNodeUserSubRequest>
): Promise<Array<UpdatedExpiryWithHash>> { ): Promise<Array<UpdatedExpiryWithHash>> {
try { try {
const result = await doSnodeBatchRequest(expireRequests, targetNode, 4000, ourPubKey, 'batch'); const result = await doSnodeBatchRequest(expireRequests, targetNode, 4000, ourPubKey, 'batch');
@ -290,7 +290,7 @@ export async function buildExpireRequestBatchExpiry(
export async function buildExpireRequestSingleExpiry( export async function buildExpireRequestSingleExpiry(
expireDetails: ExpireMessageWithExpiryOnSnodeProps expireDetails: ExpireMessageWithExpiryOnSnodeProps
): Promise<UpdateExpiryOnNodeSubRequest | null> { ): Promise<UpdateExpiryOnNodeUserSubRequest | null> {
const ourPubKey = UserUtils.getOurPubKeyStrFromCache(); const ourPubKey = UserUtils.getOurPubKeyStrFromCache();
if (!ourPubKey) { if (!ourPubKey) {
window.log.error('[buildExpireRequestSingleExpiry] No user pubkey'); window.log.error('[buildExpireRequestSingleExpiry] No user pubkey');

@ -53,6 +53,8 @@ async function getGroupInviteMessage({
createAtNetworkTimestamp, createAtNetworkTimestamp,
adminSignature, adminSignature,
memberAuthData, memberAuthData,
expirationType: 'unknown', // TODO audric do we want those not expiring?
expireTimer: 0,
}); });
return invite; return invite;
} }
@ -76,6 +78,8 @@ async function getGroupPromoteMessage({
groupPk, groupPk,
createAtNetworkTimestamp, createAtNetworkTimestamp,
groupIdentitySeed: secretKey.slice(0, 32), // the seed is the first 32 bytes of the secretkey groupIdentitySeed: secretKey.slice(0, 32), // the seed is the first 32 bytes of the secretkey
expirationType: 'unknown', // TODO audric do we want those not expiring?
expireTimer: 0,
}); });
return msg; return msg;
} }

@ -1,19 +1,18 @@
import { GroupPubkeyType } from 'libsession_util_nodejs'; import { GroupPubkeyType } from 'libsession_util_nodejs';
import { SignalService } from '../../../../../protobuf'; import { SignalService } from '../../../../../protobuf';
import { LibSodiumWrappers } from '../../../../crypto'; import { LibSodiumWrappers } from '../../../../crypto';
import { DataMessage } from '../../DataMessage'; import { ExpirableMessage, ExpirableMessageParams } from '../../ExpirableMessage';
import { MessageParams } from '../../Message';
export type AdminSigDetails = { export type AdminSigDetails = {
secretKey: Uint8Array; secretKey: Uint8Array;
sodium: LibSodiumWrappers; sodium: LibSodiumWrappers;
}; };
export interface GroupUpdateMessageParams extends MessageParams { export interface GroupUpdateMessageParams extends ExpirableMessageParams {
groupPk: GroupPubkeyType; groupPk: GroupPubkeyType;
} }
export abstract class GroupUpdateMessage extends DataMessage { export abstract class GroupUpdateMessage extends ExpirableMessage {
public readonly destination: GroupUpdateMessageParams['groupPk']; public readonly destination: GroupUpdateMessageParams['groupPk'];
constructor(params: GroupUpdateMessageParams) { constructor(params: GroupUpdateMessageParams) {

@ -9,9 +9,9 @@ import {
UserGroupsGet, UserGroupsGet,
WithGroupPubkey, WithGroupPubkey,
} from 'libsession_util_nodejs'; } from 'libsession_util_nodejs';
import { base64_variants, from_base64 } from 'libsodium-wrappers-sumo';
import { intersection, isEmpty, uniq } from 'lodash'; import { intersection, isEmpty, uniq } from 'lodash';
import { ConfigDumpData } from '../../data/configDump/configDump'; import { ConfigDumpData } from '../../data/configDump/configDump';
import { ConversationModel } from '../../models/conversation';
import { ConversationTypeEnum } from '../../models/conversationAttributes'; import { ConversationTypeEnum } from '../../models/conversationAttributes';
import { HexString } from '../../node/hexStrings'; import { HexString } from '../../node/hexStrings';
import { SignalService } from '../../protobuf'; import { SignalService } from '../../protobuf';
@ -22,10 +22,10 @@ import { RevokeChanges, SnodeAPIRevoke } from '../../session/apis/snode_api/revo
import { SnodeGroupSignature } from '../../session/apis/snode_api/signature/groupSignature'; import { SnodeGroupSignature } from '../../session/apis/snode_api/signature/groupSignature';
import { ConvoHub } from '../../session/conversations'; import { ConvoHub } from '../../session/conversations';
import { getSodiumRenderer } from '../../session/crypto'; import { getSodiumRenderer } from '../../session/crypto';
import { DisappearingMessages } from '../../session/disappearing_messages';
import { ClosedGroup } from '../../session/group/closed-group'; import { ClosedGroup } from '../../session/group/closed-group';
import { GroupUpdateInfoChangeMessage } from '../../session/messages/outgoing/controlMessage/group_v2/to_group/GroupUpdateInfoChangeMessage'; import { GroupUpdateInfoChangeMessage } from '../../session/messages/outgoing/controlMessage/group_v2/to_group/GroupUpdateInfoChangeMessage';
import { GroupUpdateMemberChangeMessage } from '../../session/messages/outgoing/controlMessage/group_v2/to_group/GroupUpdateMemberChangeMessage'; import { GroupUpdateMemberChangeMessage } from '../../session/messages/outgoing/controlMessage/group_v2/to_group/GroupUpdateMemberChangeMessage';
import { GroupUpdateDeleteMessage } from '../../session/messages/outgoing/controlMessage/group_v2/to_user/GroupUpdateDeleteMessage';
import { PubKey } from '../../session/types'; 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';
@ -487,11 +487,11 @@ async function handleRemoveMembers({
`DELETE${m}${createAtNetworkTimestamp}`, `DELETE${m}${createAtNetworkTimestamp}`,
{ secretKey } { secretKey }
); );
const deleteMessage = new GroupUpdateDeleteMessage({ // const deleteMessage = new GroupUpdateDeleteMessage({
groupPk, // groupPk,
createAtNetworkTimestamp, // createAtNetworkTimestamp,
adminSignature: from_base64(adminSignature.signature, base64_variants.ORIGINAL), // adminSignature: from_base64(adminSignature.signature, base64_variants.ORIGINAL),
}); // });
console.warn( console.warn(
'TODO: poll from namespace -11, handle messages and sig for it, batch request handle 401/403, but 200 ok for this -11 namespace' 'TODO: poll from namespace -11, handle messages and sig for it, batch request handle 401/403, but 200 ok for this -11 namespace'
); );
@ -538,6 +538,19 @@ async function getPendingRevokeChanges({
return revokeChanges; return revokeChanges;
} }
function getConvoExpireDetailsForMsg(convo: ConversationModel) {
const expireTimer = convo.getExpireTimer();
const expireDetails = {
expirationType: DisappearingMessages.changeToDisappearingMessageType(
convo,
expireTimer,
convo.getExpirationMode()
),
expireTimer,
};
return expireDetails;
}
async function handleMemberChangeFromUIOrNot({ async function handleMemberChangeFromUIOrNot({
addMembersWithHistory, addMembersWithHistory,
addMembersWithoutHistory, addMembersWithoutHistory,
@ -606,16 +619,21 @@ async function handleMemberChangeFromUIOrNot({
await GroupInvite.addJob({ groupPk, member }); await GroupInvite.addJob({ groupPk, member });
} }
const sodium = await getSodiumRenderer(); const sodium = await getSodiumRenderer();
const createAtNetworkTimestamp = GetNetworkTime.now();
const shared = {
convo,
sender: us,
sentAt: createAtNetworkTimestamp,
expireUpdate: null,
};
const allAdded = [...withHistory, ...withoutHistory]; // those are already enforced to be unique (and without intersection) in `validateMemberChange()` const allAdded = [...withHistory, ...withoutHistory]; // those are already enforced to be unique (and without intersection) in `validateMemberChange()`
const createAtNetworkTimestamp = GetNetworkTime.now();
if (fromCurrentDevice && allAdded.length) { if (fromCurrentDevice && allAdded.length) {
const msg = await ClosedGroup.addUpdateMessage( const msg = await ClosedGroup.addUpdateMessage({
convo, diff: { joiningMembers: allAdded },
{ joiningMembers: allAdded }, ...shared,
us, });
createAtNetworkTimestamp
);
await getMessageQueue().sendToGroupV2({ await getMessageQueue().sendToGroupV2({
message: new GroupUpdateMemberChangeMessage({ message: new GroupUpdateMemberChangeMessage({
added: allAdded, added: allAdded,
@ -625,16 +643,15 @@ async function handleMemberChangeFromUIOrNot({
createAtNetworkTimestamp, createAtNetworkTimestamp,
secretKey: group.secretKey, secretKey: group.secretKey,
sodium, sodium,
...getConvoExpireDetailsForMsg(convo),
}), }),
}); });
} }
if (fromCurrentDevice && removed.length) { if (fromCurrentDevice && removed.length) {
const msg = await ClosedGroup.addUpdateMessage( const msg = await ClosedGroup.addUpdateMessage({
convo, diff: { kickedMembers: removed },
{ kickedMembers: removed }, ...shared,
us, });
createAtNetworkTimestamp
);
await getMessageQueue().sendToGroupV2({ await getMessageQueue().sendToGroupV2({
message: new GroupUpdateMemberChangeMessage({ message: new GroupUpdateMemberChangeMessage({
removed, removed,
@ -644,6 +661,7 @@ async function handleMemberChangeFromUIOrNot({
createAtNetworkTimestamp, createAtNetworkTimestamp,
secretKey: group.secretKey, secretKey: group.secretKey,
sodium, sodium,
...getConvoExpireDetailsForMsg(convo),
}), }),
}); });
} }
@ -698,12 +716,13 @@ async function handleNameChangeFromUIOrNot({
const createAtNetworkTimestamp = GetNetworkTime.now(); const createAtNetworkTimestamp = GetNetworkTime.now();
if (fromCurrentDevice) { if (fromCurrentDevice) {
const msg = await ClosedGroup.addUpdateMessage( const msg = await ClosedGroup.addUpdateMessage({
convo, convo,
{ newName }, diff: { newName },
us, sender: us,
createAtNetworkTimestamp sentAt: createAtNetworkTimestamp,
); expireUpdate: null,
});
await getMessageQueue().sendToGroupV2({ await getMessageQueue().sendToGroupV2({
message: new GroupUpdateInfoChangeMessage({ message: new GroupUpdateInfoChangeMessage({
groupPk, groupPk,
@ -713,6 +732,7 @@ async function handleNameChangeFromUIOrNot({
createAtNetworkTimestamp, createAtNetworkTimestamp,
secretKey: group.secretKey, secretKey: group.secretKey,
sodium: await getSodiumRenderer(), sodium: await getSodiumRenderer(),
...getConvoExpireDetailsForMsg(convo),
}), }),
}); });
} }

@ -1,5 +1,6 @@
import chai, { expect } from 'chai'; import chai, { expect } from 'chai';
import chaiAsPromised from 'chai-as-promised'; import chaiAsPromised from 'chai-as-promised';
import { PubkeyType } from 'libsession_util_nodejs';
import Sinon from 'sinon'; import Sinon from 'sinon';
import { UpdateExpiryOnNodeUserSubRequest } from '../../../../session/apis/snode_api/SnodeRequestTypes'; import { UpdateExpiryOnNodeUserSubRequest } from '../../../../session/apis/snode_api/SnodeRequestTypes';
import { import {
@ -19,7 +20,8 @@ chai.use(chaiAsPromised as any);
describe('ExpireRequest', () => { describe('ExpireRequest', () => {
const getLatestTimestampOffset = 200000; const getLatestTimestampOffset = 200000;
const ourNumber = '37e1631b002de498caf7c5c1712718bde7f257c6dadeed0c21abf5e939e6c309'; const ourNumber =
'37e1631b002de498caf7c5c1712718bde7f257c6dadeed0c21abf5e939e6c309' as PubkeyType;
const ourUserEd25516Keypair = { const ourUserEd25516Keypair = {
pubKey: '37e1631b002de498caf7c5c1712718bde7f257c6dadeed0c21abf5e939e6c309', pubKey: '37e1631b002de498caf7c5c1712718bde7f257c6dadeed0c21abf5e939e6c309',
privKey: privKey:

@ -1,5 +1,6 @@
import chai, { expect } from 'chai'; import chai, { expect } from 'chai';
import chaiAsPromised from 'chai-as-promised'; import chaiAsPromised from 'chai-as-promised';
import { PubkeyType } from 'libsession_util_nodejs';
import Sinon from 'sinon'; import Sinon from 'sinon';
import { import {
GetExpiriesFromNodeSubRequest, GetExpiriesFromNodeSubRequest,
@ -23,7 +24,8 @@ describe('GetExpiriesRequest', () => {
stubWindowLog(); stubWindowLog();
const getLatestTimestampOffset = 200000; const getLatestTimestampOffset = 200000;
const ourNumber = '37e1631b002de498caf7c5c1712718bde7f257c6dadeed0c21abf5e939e6c309'; const ourNumber =
'37e1631b002de498caf7c5c1712718bde7f257c6dadeed0c21abf5e939e6c309' as PubkeyType;
const ourUserEd25516Keypair = { const ourUserEd25516Keypair = {
pubKey: '37e1631b002de498caf7c5c1712718bde7f257c6dadeed0c21abf5e939e6c309', pubKey: '37e1631b002de498caf7c5c1712718bde7f257c6dadeed0c21abf5e939e6c309',
privKey: privKey:

File diff suppressed because it is too large Load Diff
Loading…
Cancel
Save