From da576d72e174698f9c52fc7c5039d01d44c37d68 Mon Sep 17 00:00:00 2001 From: Dylan <36567925+Airyzz@users.noreply.github.com> Date: Sun, 18 Sep 2022 18:43:03 +0930 Subject: [PATCH] Implemented E2EE on timezone sharing --- .../molecules/room-timezone/RoomTimezone.jsx | 21 ++++++++++++---- src/app/organisms/room/RoomBanner.jsx | 24 +++++++++++++++++-- 2 files changed, 38 insertions(+), 7 deletions(-) diff --git a/src/app/molecules/room-timezone/RoomTimezone.jsx b/src/app/molecules/room-timezone/RoomTimezone.jsx index 9ca09ea2..201f24b9 100644 --- a/src/app/molecules/room-timezone/RoomTimezone.jsx +++ b/src/app/molecules/room-timezone/RoomTimezone.jsx @@ -1,4 +1,4 @@ -import React, { useState, useEffect, useCallback } from 'react'; +import React, { useState } from 'react'; import PropTypes from 'prop-types'; import initMatrix from '../../../client/initMatrix'; @@ -12,19 +12,30 @@ function RoomTimezone({ roomId }) { const room = mx.getRoom(roomId); const userId = mx.getUserId(); - const currentTimezone = room.currentState.getStateEvents('in.cinny.share_timezone', userId)?.event?.content?.user_timezone; + const timezoneEventId = room.currentState.getStateEvents('in.cinny.shared_timezone', userId)?.event?.content?.user_timezone_event; + const timezoneEvent = room.findEventById(timezoneEventId); + const timezoneContent = timezoneEvent?.getContent(); - const [timezone, setTimezone] = useState(currentTimezone); + const [timezone, setTimezone] = useState(timezoneContent?.user_timezone); const clearTimezone = () => { - mx.sendStateEvent(roomId, 'in.cinny.share_timezone', { }, userId); + const eventKey = room.currentState.getStateEvents('in.cinny.shared_timezone', userId)?.event?.content?.user_timezone_event; + mx.redactEvent(roomId, eventKey); + mx.sendStateEvent(roomId, 'in.cinny.shared_timezone', { }, userId); setTimezone(null); }; const shareTimezone = () => { const userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone; setTimezone(userTimezone); - mx.sendStateEvent(roomId, 'in.cinny.share_timezone', { user_timezone: userTimezone }, userId); + const content = { + user_timezone: userTimezone, + msgtype: 'in.cinny.share_timezone', + }; + mx.sendEvent(roomId, 'in.cinny.share_timezone', content).then((event) => { + // Append the shared timezone event to the room state + mx.sendStateEvent(roomId, 'in.cinny.shared_timezone', { user_timezone_event: event.event_id }, userId); + }); }; return ( diff --git a/src/app/organisms/room/RoomBanner.jsx b/src/app/organisms/room/RoomBanner.jsx index 32e10443..4bdf80c8 100644 --- a/src/app/organisms/room/RoomBanner.jsx +++ b/src/app/organisms/room/RoomBanner.jsx @@ -21,10 +21,18 @@ function RoomBanner({ roomId }) { let partner = null; + if (isDM) { + partner = room.getAvatarFallbackMember(); + } + + const timezoneEventId = room.currentState.getStateEvents('in.cinny.shared_timezone', partner?.userId)?.event?.content?.user_timezone_event; + const timezoneEvent = room.findEventById(timezoneEventId); + + let timezoneContent = null; + const updateTime = () => { if (isDM) { - partner = room.getAvatarFallbackMember(); - const timezone = room.currentState.getStateEvents('in.cinny.share_timezone', partner.userId)?.event?.content?.user_timezone; + const timezone = timezoneContent?.user_timezone; const date = new Date(); try { @@ -38,6 +46,18 @@ function RoomBanner({ roomId }) { } }; + if (timezoneEvent) { + if (!timezoneEvent.getClearContent()) { + timezoneEvent.attemptDecryption(mx.crypto); + } + + timezoneContent = timezoneEvent.getContent(); + timezoneEvent.getDecryptionPromise()?.then(() => { + timezoneContent = timezoneEvent.getContent(); + updateTime(); + }); + } + useEffect(() => { updateTime(); const interval = setInterval(() => updateTime(), 20000);