Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Use rust crypto instead of libolm #1965

Closed
wants to merge 11 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,410 changes: 19 additions & 1,391 deletions package-lock.json

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion src/app/components/CapabilitiesAndMediaConfigLoader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ export function CapabilitiesAndMediaConfigLoader({
[]
>(
useCallback(async () => {
const result = await Promise.allSettled([mx.getCapabilities(true), mx.getMediaConfig()]);
const result = await Promise.allSettled([mx.getCapabilities(), mx.getMediaConfig()]);
const capabilities = promiseFulfilledResult(result[0]);
const mediaConfig = promiseFulfilledResult(result[1]);
return [capabilities, mediaConfig];
Expand Down
2 changes: 1 addition & 1 deletion src/app/components/CapabilitiesLoader.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ type CapabilitiesLoaderProps = {
export function CapabilitiesLoader({ children }: CapabilitiesLoaderProps) {
const mx = useMatrixClient();

const [state, load] = useAsyncCallback(useCallback(() => mx.getCapabilities(true), [mx]));
const [state, load] = useAsyncCallback(useCallback(() => mx.getCapabilities(), [mx]));

useEffect(() => {
load();
Expand Down
5 changes: 3 additions & 2 deletions src/app/features/lobby/Lobby.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,8 @@ import { Box, Icon, IconButton, Icons, Line, Scroll, config } from 'folds';
import { useVirtualizer } from '@tanstack/react-virtual';
import { useAtom, useAtomValue } from 'jotai';
import { useNavigate } from 'react-router-dom';
import { IJoinRuleEventContent, JoinRule, RestrictedAllowType, Room } from 'matrix-js-sdk';
import { JoinRule, RestrictedAllowType, Room } from 'matrix-js-sdk';
import { RoomJoinRulesEventContent } from 'matrix-js-sdk/lib/types';
import { useSpace } from '../../hooks/useSpace';
import { Page, PageContent, PageContentCenter, PageHeroSection } from '../../components/page';
import { HierarchyItem, useSpaceHierarchy } from '../../hooks/useSpaceHierarchy';
Expand Down Expand Up @@ -258,7 +259,7 @@ export function Lobby() {
const joinRuleContent = getStateEvent(
itemRoom,
StateEvent.RoomJoinRules
)?.getContent<IJoinRuleEventContent>();
)?.getContent<RoomJoinRulesEventContent>();

if (joinRuleContent) {
const allow =
Expand Down
4 changes: 2 additions & 2 deletions src/app/features/room/RoomInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ export const RoomInput = forwardRef<HTMLDivElement, RoomInputProps>(
const safeFiles = files.map(safeFile);
const fileItems: TUploadItem[] = [];

if (mx.isRoomEncrypted(roomId)) {
if (room.hasEncryptionStateEvent()) {
const encryptFiles = fulfilledPromiseSettledResult(
await Promise.allSettled(safeFiles.map((f) => encryptFile(f)))
);
Expand All @@ -172,7 +172,7 @@ export const RoomInput = forwardRef<HTMLDivElement, RoomInputProps>(
item: fileItems,
});
},
[setSelectedFiles, roomId, mx]
[setSelectedFiles, room]
);
const pickFile = useFilePicker(handleFiles, true);
const handlePaste = useFilePasteHandler(handleFiles);
Expand Down
8 changes: 5 additions & 3 deletions src/app/features/room/RoomTimeline.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -336,7 +336,10 @@ const useTimelinePagination = (
backwards ? Direction.Backward : Direction.Forward
) ?? timelineToPaginate;
// Decrypt all event ahead of render cycle
if (mx.isRoomEncrypted(fetchedTimeline.getRoomId() ?? '')) {
const roomId = fetchedTimeline.getRoomId();
const room = roomId ? mx.getRoom(roomId) : null;

if (room?.hasEncryptionStateEvent()) {
await to(decryptAllTimelineEvent(mx, fetchedTimeline));
}

Expand Down Expand Up @@ -421,15 +424,14 @@ const getRoomUnreadInfo = (room: Room, scrollTo = false) => {
export function RoomTimeline({ room, eventId, roomInputRef, editor }: RoomTimelineProps) {
const mx = useMatrixClient();
const useAuthentication = useMediaAuthentication();
const encryptedRoom = mx.isRoomEncrypted(room.roomId);
const [messageLayout] = useSetting(settingsAtom, 'messageLayout');
const [messageSpacing] = useSetting(settingsAtom, 'messageSpacing');
const [hideMembershipEvents] = useSetting(settingsAtom, 'hideMembershipEvents');
const [hideNickAvatarEvents] = useSetting(settingsAtom, 'hideNickAvatarEvents');
const [mediaAutoLoad] = useSetting(settingsAtom, 'mediaAutoLoad');
const [urlPreview] = useSetting(settingsAtom, 'urlPreview');
const [encUrlPreview] = useSetting(settingsAtom, 'encUrlPreview');
const showUrlPreview = encryptedRoom ? encUrlPreview : urlPreview;
const showUrlPreview = room.hasEncryptionStateEvent() ? encUrlPreview : urlPreview;
const [showHiddenEvents] = useSetting(settingsAtom, 'showHiddenEvents');
const setReplyDraft = useSetAtom(roomIdToReplyDraftAtomFamily(room.roomId));
const powerLevels = usePowerLevelsContext();
Expand Down
63 changes: 60 additions & 3 deletions src/app/molecules/image-pack/ImagePack.jsx
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import React, { useState, useMemo, useReducer, useEffect } from 'react';
import PropTypes from 'prop-types';
import { EventTimeline } from 'matrix-js-sdk';
import './ImagePack.scss';

import { openReusableDialog } from '../../../client/action/navigation';
Expand All @@ -18,7 +19,11 @@ import ImagePackItem from './ImagePackItem';
import ImagePackUpload from './ImagePackUpload';
import { useMatrixClient } from '../../hooks/useMatrixClient';
import { useMediaAuthentication } from '../../hooks/useMediaAuthentication';
import { getStateEvent } from '../../utils/room';

const renameImagePackItem = (shortcode) =>
new Promise((resolve) => {
let isCompleted = false;
const renameImagePackItem = (shortcode) =>
new Promise((resolve) => {
let isCompleted = false;
Expand Down Expand Up @@ -52,6 +57,35 @@ const renameImagePackItem = (shortcode) =>
}
);
});
openReusableDialog(
<Text variant="s1" weight="medium">
Rename
</Text>,
(requestClose) => (
<div style={{ padding: 'var(--sp-normal)' }}>
<form
onSubmit={(e) => {
e.preventDefault();
const sc = e.target.shortcode.value;
if (sc.trim() === '') return;
isCompleted = true;
resolve(sc.trim());
requestClose();
}}
>
<Input value={shortcode} name="shortcode" label="Shortcode" autoFocus required />
<div style={{ height: 'var(--sp-normal)' }} />
<Button variant="primary" type="submit">
Rename
</Button>
</form>
</div>
),
() => {
if (!isCompleted) resolve(null);
}
);
});

function getUsage(usage) {
if (usage.includes('emoticon') && usage.includes('sticker')) return 'both';
Expand All @@ -76,7 +110,7 @@ function useRoomImagePack(roomId, stateKey) {
const room = mx.getRoom(roomId);

const pack = useMemo(() => {
const packEvent = room.currentState.getStateEvents('im.ponies.room_emotes', stateKey);
const packEvent = getStateEvent(room, 'im.ponies.room_emotes', stateKey);
return ImagePackBuilder.parsePack(packEvent.getId(), packEvent.getContent());
}, [room, stateKey]);

Expand All @@ -101,6 +135,13 @@ function useUserImagePack() {
images: {},
}
);
return ImagePackBuilder.parsePack(
mx.getUserId(),
packEvent?.getContent() ?? {
pack: { display_name: 'Personal' },
images: {},
}
);
}, [mx]);

const sendPackContent = (content) => {
Expand All @@ -121,6 +162,7 @@ function useImagePackHandles(pack, sendPackContent) {
let newKey = key?.replace(/\s/g, '_');
if (pack.getImages().get(newKey)) {
newKey = suffixRename(newKey, (suffixedKey) => pack.getImages().get(suffixedKey));
newKey = suffixRename(newKey, (suffixedKey) => pack.getImages().get(suffixedKey));
}
return newKey;
};
Expand Down Expand Up @@ -245,14 +287,18 @@ function ImagePack({ roomId, stateKey, handlePackDelete }) {
};

const myPowerlevel = room.getMember(mx.getUserId())?.powerLevel || 0;
const canChange = room.currentState.hasSufficientPowerLevelFor('state_default', myPowerlevel);
const canChange = room
.getLiveTimeline()
.getState(EventTimeline.FORWARDS)
?.hasSufficientPowerLevelFor('state_default', myPowerlevel);

const handleDeletePack = async () => {
const isConfirmed = await confirmDialog(
'Delete Pack',
`Are you sure that you want to delete "${pack.displayName}"?`,
'Delete',
'danger'
'danger'
);
if (!isConfirmed) return;
handlePackDelete(stateKey);
Expand Down Expand Up @@ -284,6 +330,8 @@ function ImagePack({ roomId, stateKey, handlePackDelete }) {
onEditProfile={canChange ? handleEditProfile : null}
/>
{canChange && <ImagePackUpload onUpload={handleAddItem} />}
{images.length === 0 ? null : (
{canChange && <ImagePackUpload onUpload={handleAddItem} />}
{images.length === 0 ? null : (
<div>
<div className="image-pack__header">
Expand Down Expand Up @@ -319,6 +367,12 @@ function ImagePack({ roomId, stateKey, handlePackDelete }) {
{viewMore ? 'View less' : `View ${pack.images.size - 2} more`}
</Button>
)}
{handlePackDelete && (
<Button variant="danger" onClick={handleDeletePack}>
Delete Pack
{viewMore ? 'View less' : `View ${pack.images.size - 2} more`}
</Button>
)}
{handlePackDelete && (
<Button variant="danger" onClick={handleDeletePack}>
Delete Pack
Expand Down Expand Up @@ -389,6 +443,7 @@ function ImagePackUser() {
onEditProfile={handleEditProfile}
/>
<ImagePackUpload onUpload={handleAddItem} />
{images.length === 0 ? null : (
{images.length === 0 ? null : (
<div>
<div className="image-pack__header">
Expand Down Expand Up @@ -417,10 +472,12 @@ function ImagePackUser() {
))}
</div>
)}
{pack.images.size > 2 && (
{pack.images.size > 2 && (
<div className="image-pack__footer">
<Button onClick={() => setViewMore(!viewMore)}>
{viewMore ? 'View less' : `View ${pack.images.size - 2} more`}
{viewMore ? 'View less' : `View ${pack.images.size - 2} more`}
</Button>
</div>
)}
Expand Down Expand Up @@ -473,7 +530,7 @@ function ImagePackGlobal() {
[...roomIdToStateKeys].map(([roomId, stateKeys]) => {
const room = mx.getRoom(roomId);
return stateKeys.map((stateKey) => {
const data = room.currentState.getStateEvents('im.ponies.room_emotes', stateKey);
const data = getStateEvent(room, 'im.ponies.room_emotes', stateKey);
const pack = ImagePackBuilder.parsePack(data?.getId(), data?.getContent());
if (!pack) return null;
return (
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ function ExportE2ERoomKeys() {
type: cons.status.IN_FLIGHT,
});
try {
const keys = await mx.exportRoomKeys();
const keys = await mx.getCrypto()?.exportRoomKeys();
if (isMountStore.getItem()) {
setStatus({
isOngoing: true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,7 +46,7 @@ function ImportE2ERoomKeys() {
type: cons.status.IN_FLIGHT,
});
}
await mx.importRoomKeys(JSON.parse(keys));
await mx.getCrypto()?.importRoomKeys(JSON.parse(keys));
if (isMountStore.getItem()) {
setStatus({
isOngoing: false,
Expand Down
3 changes: 2 additions & 1 deletion src/app/molecules/room-aliases/RoomAliases.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import React, { useState, useEffect } from 'react';
import PropTypes from 'prop-types';
import './RoomAliases.scss';
import { EventTimeline } from 'matrix-js-sdk';

import cons from '../../../client/state/cons';
import { Debounce } from '../../../util/common';
Expand Down Expand Up @@ -108,7 +109,7 @@ function RoomAliases({ roomId }) {
const [deleteAlias, setDeleteAlias] = useState(null);
const [validate, setValidateToDefault, handleAliasChange] = useValidate(hsString);

const canPublishAlias = room.currentState.maySendStateEvent('m.room.canonical_alias', userId);
const canPublishAlias = room.getLiveTimeline().getState(EventTimeline.FORWARDS)?.maySendStateEvent('m.room.canonical_alias', userId);

useEffect(() => {
isMountedStore.setItem(true)
Expand Down
8 changes: 5 additions & 3 deletions src/app/molecules/room-emojis/RoomEmojis.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import React, { useReducer, useEffect } from 'react';
import PropTypes from 'prop-types';
import './RoomEmojis.scss';
import { EventTimeline } from 'matrix-js-sdk';

import { suffixRename } from '../../../util/common';

Expand All @@ -10,12 +11,13 @@ import Input from '../../atoms/input/Input';
import Button from '../../atoms/button/Button';
import ImagePack from '../image-pack/ImagePack';
import { useMatrixClient } from '../../hooks/useMatrixClient';
import { getStateEvent, getStateEvents } from '../../utils/room';

function useRoomPacks(room) {
const mx = useMatrixClient();
const [, forceUpdate] = useReducer((count) => count + 1, 0);

const packEvents = room.currentState.getStateEvents('im.ponies.room_emotes');
const packEvents = getStateEvents(room, 'im.ponies.room_emotes');
const unUsablePacks = [];
const usablePacks = packEvents.filter((mEvent) => {
if (typeof mEvent.getContent()?.images !== 'object') {
Expand All @@ -40,7 +42,7 @@ function useRoomPacks(room) {
};
}, [room, mx]);

const isStateKeyAvailable = (key) => !room.currentState.getStateEvents('im.ponies.room_emotes', key);
const isStateKeyAvailable = (key) => !getStateEvent(room, 'im.ponies.room_emotes', key);

const createPack = async (name) => {
const packContent = {
Expand Down Expand Up @@ -80,7 +82,7 @@ function RoomEmojis({ roomId }) {

const { usablePacks, createPack, deletePack } = useRoomPacks(room);

const canChange = room.currentState.maySendStateEvent('im.ponies.room_emote', mx.getUserId());
const canChange = room.getLiveTimeline().getState(EventTimeline.FORWARDS)?.maySendStateEvent('im.ponies.room_emote', mx.getUserId());

const handlePackCreate = (e) => {
e.preventDefault();
Expand Down
7 changes: 4 additions & 3 deletions src/app/molecules/room-encryption/RoomEncryption.jsx
Original file line number Diff line number Diff line change
@@ -1,21 +1,22 @@
import React, { useState } from 'react';
import PropTypes from 'prop-types';
import './RoomEncryption.scss';

import { EventTimeline } from 'matrix-js-sdk';

import Text from '../../atoms/text/Text';
import Toggle from '../../atoms/button/Toggle';
import SettingTile from '../setting-tile/SettingTile';

import { confirmDialog } from '../confirm-dialog/ConfirmDialog';
import { useMatrixClient } from '../../hooks/useMatrixClient';
import { getStateEvents } from '../../utils/room';

function RoomEncryption({ roomId }) {
const mx = useMatrixClient();
const room = mx.getRoom(roomId);
const encryptionEvents = room.currentState.getStateEvents('m.room.encryption');
const encryptionEvents = getStateEvents(room, 'm.room.encryption');
const [isEncrypted, setIsEncrypted] = useState(encryptionEvents.length > 0);
const canEnableEncryption = room.currentState.maySendStateEvent('m.room.encryption', mx.getUserId());
const canEnableEncryption = room.getLiveTimeline().getState(EventTimeline.FORWARDS).maySendStateEvent('m.room.encryption', mx.getUserId());

const handleEncryptionEnable = async () => {
const joinRule = room.getJoinRule();
Expand Down
6 changes: 4 additions & 2 deletions src/app/molecules/room-permissions/RoomPermissions.jsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import React, { useEffect } from 'react';
import PropTypes from 'prop-types';
import './RoomPermissions.scss';
import { EventTimeline } from 'matrix-js-sdk';

import { getPowerLabel } from '../../../util/matrixUtil';
import { openReusableContextMenu } from '../../../client/action/navigation';
Expand All @@ -16,6 +17,7 @@ import ChevronBottomIC from '../../../../public/res/ic/outlined/chevron-bottom.s

import { useForceUpdate } from '../../hooks/useForceUpdate';
import { useMatrixClient } from '../../hooks/useMatrixClient';
import { getStateEvent } from '../../utils/room';

const permissionsInfo = {
users_default: {
Expand Down Expand Up @@ -176,9 +178,9 @@ function RoomPermissions({ roomId }) {
useRoomStateUpdate(roomId);
const mx = useMatrixClient();
const room = mx.getRoom(roomId);
const pLEvent = room.currentState.getStateEvents('m.room.power_levels')[0];
const pLEvent = getStateEvent(room, 'm.room.power_levels');
const permissions = pLEvent.getContent();
const canChangePermission = room.currentState.maySendStateEvent('m.room.power_levels', mx.getUserId());
const canChangePermission = room.getLiveTimeline().getState(EventTimeline.FORWARDS)?.maySendStateEvent('m.room.power_levels', mx.getUserId());
const myPowerLevel = room.getMember(mx.getUserId())?.powerLevel ?? 100;

const handlePowerSelector = (e, permKey, parentKey, powerLevel) => {
Expand Down
4 changes: 2 additions & 2 deletions src/app/molecules/room-visibility/RoomVisibility.jsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import React, { useState, useEffect, useCallback } from 'react';
import PropTypes from 'prop-types';
import './RoomVisibility.scss';

import { EventTimeline } from 'matrix-js-sdk';

import Text from '../../atoms/text/Text';
import RadioButton from '../../atoms/button/RadioButton';
Expand Down Expand Up @@ -74,7 +74,7 @@ function RoomVisibility({ roomId }) {
const roomVersion = Number(mCreate?.room_version ?? 0);

const myPowerlevel = room.getMember(mx.getUserId())?.powerLevel || 0;
const canChange = room.currentState.hasSufficientPowerLevelFor('state_default', myPowerlevel);
const canChange = room.getLiveTimeline().getState(EventTimeline.FORWARDS)?.hasSufficientPowerLevelFor('state_default', myPowerlevel);

const items = [{
iconSrc: isSpace ? SpaceLockIC : HashLockIC,
Expand Down
Loading
Loading