Skip to content

Commit 9a52632

Browse files
committed
fix: fix profile setting
1 parent 009e334 commit 9a52632

File tree

3 files changed

+72
-69
lines changed

3 files changed

+72
-69
lines changed

src/ic_message_frontend/src/lib/components/messages/ChannelDetail.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@
133133
{#if openMessages}
134134
<ChannelMessages {myState} {myInfo} channelInfo={$channelInfo} />
135135
{:else}
136-
<ChannelSetting {myState} {myInfo} channelInfo={$channelInfo} />
136+
<ChannelSetting {myState} {myInfo} {channelInfo} />
137137
{/if}
138138
{:else}
139139
<div class="m-auto size-24 rounded-full *:size-24">

src/ic_message_frontend/src/lib/components/messages/ChannelSetting.svelte

Lines changed: 54 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -35,38 +35,26 @@
3535
3636
export let myState: MyMessageState
3737
export let myInfo: Readable<UserInfo>
38-
export let channelInfo: ChannelInfoEx
38+
export let channelInfo: Readable<ChannelInfoEx>
3939
4040
const toastStore = getToastStore()
4141
const modalStore = getModalStore()
4242
const members: Writable<DisplayUserInfoEx[]> = writable([])
4343
const myID = $myInfo.id.toText()
44-
const { canister, id } = channelInfo
44+
const { canister, id } = $channelInfo
4545
46-
let mute = channelInfo.my_setting.mute
46+
let mute = $channelInfo.my_setting.mute
4747
let isManager = false
48-
let kekStatus = 0
49-
50-
$: {
51-
if (channelInfo.my_setting.ecdh_remote.length > 0) {
52-
kekStatus = 1 // should accept the key
53-
} else if (channelInfo.my_setting.ecdh_pub.length > 0) {
54-
kekStatus = 2 // should wait for the key
55-
} else if (channelInfo._kek && !channelInfo._invalidKEK) {
56-
kekStatus = 3 // key exists
57-
} else {
58-
kekStatus = 0
59-
}
60-
}
48+
let validKEK = true
6149
6250
$: hasExchangeKeys =
63-
channelInfo.ecdh_request.filter(
51+
$channelInfo.ecdh_request.filter(
6452
(r) => r[0].toText() !== myID && r[1][1].length === 0
6553
).length > 0
6654
6755
async function loadMembers() {
68-
const res = await myState.channelMembers(channelInfo, $myInfo)
69-
isManager = channelInfo._managers.includes(myID)
56+
const res = await myState.channelMembers($channelInfo, $myInfo)
57+
isManager = $channelInfo._managers.includes(myID)
7058
members.set(res)
7159
}
7260
@@ -76,12 +64,12 @@
7664
component: {
7765
ref: ChannelEditModal,
7866
props: {
79-
channel: channelInfo,
67+
channel: $channelInfo,
8068
onSave: (input: UpdateChannelInput) => {
8169
return toastRun(async (signal: AbortSignal) => {
8270
const api = myState.api.channelAPI(canister)
8371
await api.update_channel(input)
84-
channelInfo = await myState.refreshChannel(channelInfo)
72+
await myState.refreshChannel($channelInfo)
8573
}, toastStore).finally()
8674
}
8775
}
@@ -115,7 +103,7 @@
115103
mute: [mute],
116104
last_read: []
117105
})
118-
channelInfo = await myState.refreshChannel(channelInfo)
106+
await myState.refreshChannel($channelInfo)
119107
}, toastStore).finally(() => {
120108
muteSubmitting = false
121109
})
@@ -126,27 +114,29 @@
126114
myECDHSubmitting = true
127115
128116
toastRun(async (signal: AbortSignal) => {
129-
if (channelInfo.my_setting.ecdh_remote.length === 1) {
117+
if ($channelInfo.my_setting.ecdh_remote.length === 1) {
130118
try {
131-
await myState.acceptKEK(channelInfo)
132-
await myState.decryptChannelDEK(channelInfo)
119+
await myState.acceptKEK($channelInfo)
120+
await myState.decryptChannelDEK($channelInfo)
121+
validKEK = true
133122
} catch (err: any) {
123+
validKEK = false
134124
toastStore.trigger({
135125
timeout: 10000,
136126
hideDismiss: false,
137127
background: 'variant-soft-error',
138128
message: `Failed to receive the key. A new key has been requested.\n<br />Error: ${errMessage(err)}`
139129
})
140-
const my_setting = { ...channelInfo.my_setting }
130+
const my_setting = { ...$channelInfo.my_setting }
141131
my_setting.ecdh_remote = []
142132
my_setting.ecdh_pub = []
143-
await myState.requestKEK({ ...channelInfo, my_setting })
133+
await myState.requestKEK({ ...$channelInfo, my_setting })
144134
}
145135
} else {
146-
await myState.requestKEK(channelInfo)
136+
await myState.requestKEK($channelInfo)
147137
}
148138
149-
channelInfo = await myState.refreshChannel(channelInfo)
139+
await myState.refreshChannel($channelInfo)
150140
}, toastStore).finally(() => {
151141
myECDHSubmitting = false
152142
})
@@ -155,7 +145,7 @@
155145
let leavingWord = ''
156146
let myLeavingSubmitting = false
157147
function onClickMyLeaving() {
158-
if (leavingWord.trim() != channelInfo.name) {
148+
if (leavingWord.trim() != $channelInfo.name) {
159149
return
160150
}
161151
@@ -176,9 +166,9 @@
176166
adminExchangeKeysSubmitting = true
177167
toastRun(async (signal: AbortSignal) => {
178168
// fetch the latest ECDH request
179-
channelInfo = await myState.refreshChannel(channelInfo)
180-
await myState.adminExchangeKEK(channelInfo)
181-
channelInfo = await myState.refreshChannel(channelInfo)
169+
await myState.refreshChannel($channelInfo)
170+
await myState.adminExchangeKEK($channelInfo)
171+
await myState.refreshChannel($channelInfo)
182172
await loadMembers()
183173
}, toastStore).finally(() => {
184174
adminExchangeKeysSubmitting = false
@@ -187,14 +177,14 @@
187177
188178
let adminAddManagersSubmitting = false
189179
function onClickAdminAddManagers() {
190-
const existsMembers = channelInfo.members.map((m) => m.toText())
180+
const existsMembers = $channelInfo.members.map((m) => m.toText())
191181
modalStore.trigger({
192182
type: 'component',
193183
component: {
194184
ref: UserSelectModal,
195185
props: {
196186
isAddManager: true,
197-
existsManagers: channelInfo._managers,
187+
existsManagers: $channelInfo._managers,
198188
existsMembers,
199189
myState: myState,
200190
onSave: (members: Array<[Principal, Uint8Array | null]>) => {
@@ -207,11 +197,11 @@
207197
members.length === 1 &&
208198
existsMembers.includes(member[0].toText())
209199
) {
210-
await myState.adminAddManager(channelInfo, member[0])
200+
await myState.adminAddManager($channelInfo, member[0])
211201
} else {
212-
await myState.adminAddMembers(channelInfo, 'Manager', members)
202+
await myState.adminAddMembers($channelInfo, 'Manager', members)
213203
}
214-
channelInfo = await myState.refreshChannel(channelInfo)
204+
await myState.refreshChannel($channelInfo)
215205
await loadMembers()
216206
}, toastStore).finally(() => {
217207
adminAddManagersSubmitting = false
@@ -230,14 +220,14 @@
230220
ref: UserSelectModal,
231221
props: {
232222
isAddManager: false,
233-
existsManagers: channelInfo._managers,
234-
existsMembers: channelInfo.members.map((m) => m.toText()),
223+
existsManagers: $channelInfo._managers,
224+
existsMembers: $channelInfo.members.map((m) => m.toText()),
235225
myState: myState,
236226
onSave: (members: Array<[Principal, Uint8Array | null]>) => {
237227
adminAddMembersSubmitting = true
238228
toastRun(async (signal: AbortSignal) => {
239-
await myState.adminAddMembers(channelInfo, 'Member', members)
240-
channelInfo = await myState.refreshChannel(channelInfo)
229+
await myState.adminAddMembers($channelInfo, 'Member', members)
230+
await myState.refreshChannel($channelInfo)
241231
await loadMembers()
242232
}, toastStore).finally(() => {
243233
adminAddMembersSubmitting = false
@@ -261,7 +251,7 @@
261251
} as ChannelECDHInput
262252
})
263253
264-
channelInfo = await myState.refreshChannel(channelInfo)
254+
await myState.refreshChannel($channelInfo)
265255
await loadMembers()
266256
}, toastStore).finally(() => {
267257
adminRemoveMembersSubmitting = ''
@@ -270,7 +260,13 @@
270260
271261
onMount(() => {
272262
const { abort } = toastRun(async (signal: AbortSignal) => {
273-
channelInfo = await myState.refreshChannel(channelInfo, true)
263+
await myState.refreshChannel($channelInfo, true)
264+
try {
265+
await myState.decryptChannelDEK($channelInfo)
266+
validKEK = true
267+
} catch (_e) {
268+
validKEK = false
269+
}
274270
await loadMembers()
275271
}, toastStore)
276272
@@ -283,16 +279,16 @@
283279
>
284280
<section class="mt-4 flex w-full flex-row items-center gap-4 self-start px-4">
285281
<Avatar
286-
initials={channelInfo.name}
287-
src={channelInfo.image}
282+
initials={$channelInfo.name}
283+
src={$channelInfo.image}
288284
border="border-4 border-white"
289-
background={channelInfo.image ? '' : 'bg-panda'}
285+
background={$channelInfo.image ? '' : 'bg-panda'}
290286
fill="fill-white"
291287
width="w-16"
292288
/>
293289
<div class="flex-1">
294290
<p class="flex flex-row">
295-
<span>{channelInfo.name}</span>
291+
<span>{$channelInfo.name}</span>
296292
{#if isManager}
297293
<button
298294
type="button"
@@ -303,9 +299,9 @@
303299
</button>
304300
{/if}
305301
</p>
306-
{#if channelInfo.description}
302+
{#if $channelInfo.description}
307303
<div class="mt-2">
308-
{@html md.render(channelInfo.description)}
304+
{@html md.render($channelInfo.description)}
309305
</div>
310306
{/if}
311307
</div>
@@ -314,12 +310,12 @@
314310
<div class="flex flex-row items-center gap-1">
315311
<span class="text-sm font-normal text-neutral-500">Messages:</span>
316312
<span class="font-bold text-panda"
317-
>{channelInfo.latest_message_id - channelInfo.message_start + 1}</span
313+
>{$channelInfo.latest_message_id - $channelInfo.message_start + 1}</span
318314
>
319315
</div>
320316
<div class="flex flex-row items-center gap-2">
321317
<span class="text-sm font-normal text-neutral-500">Gas Balance:</span>
322-
<span class="font-bold text-panda">{channelInfo.gas}</span>
318+
<span class="font-bold text-panda">{$channelInfo.gas}</span>
323319
</div>
324320
<button
325321
type="button"
@@ -348,19 +344,19 @@
348344
</div>
349345
<div class="flex flex-row items-center gap-4">
350346
<p>Request encryption key:</p>
351-
{#if kekStatus === 1}
347+
{#if $channelInfo.my_setting.ecdh_remote.length > 0}
352348
<button
353349
type="button"
354350
class="variant-filled-success btn btn-sm"
355351
on:click={onClickMyECDH}
356352
disabled={myECDHSubmitting}
357353
><span>Key received, accept it</span></button
358354
>
359-
{:else if kekStatus === 2}
355+
{:else if $channelInfo.my_setting.ecdh_pub.length > 0}
360356
<span class="text-sm opacity-50"
361357
>Request sent, waiting for a manager share key</span
362358
>
363-
{:else if kekStatus === 3}
359+
{:else if validKEK}
364360
<span class="text-sm opacity-50"
365361
>Key already exists, no action needed</span
366362
>
@@ -393,7 +389,7 @@
393389
class="variant-filled-warning !px-2 disabled:variant-filled-surface"
394390
on:click={onClickMyLeaving}
395391
disabled={myLeavingSubmitting ||
396-
leavingWord.trim() != channelInfo.name}
392+
leavingWord.trim() != $channelInfo.name}
397393
><span class="*:size-5">
398394
{#if myLeavingSubmitting}
399395
<IconCircleSpin />
@@ -404,9 +400,9 @@
404400
>
405401
</div>
406402
</div>
407-
{#if isManager && channelInfo._managers.length < 2}
403+
{#if isManager && $channelInfo._managers.length < 2}
408404
<p
409-
class="h-5 text-sm text-error-500 {leavingWord === channelInfo.name
405+
class="h-5 text-sm text-error-500 {leavingWord === $channelInfo.name
410406
? 'visible'
411407
: 'invisible'}"
412408
>You are the only manager. Leaving the channel will delete all its data.</p

src/ic_message_frontend/src/lib/stores/message.ts

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,6 @@ export type ChannelBasicInfoEx = ChannelBasicInfo & {
109109
export type ChannelInfoEx = ChannelInfo &
110110
SyncAt & {
111111
_kek: Uint8Array | null
112-
_invalidKEK: boolean
113112
_managers: string[]
114113
}
115114

@@ -437,14 +436,12 @@ export class MyMessageState {
437436
throw new Error('Channel encryption key not ready')
438437
}
439438

440-
info._invalidKEK = true
441439
const mk = (await this.mustMasterKey()).toA256GCMKey()
442440
const aad = new Uint8Array()
443441
let data = await coseA256GCMDecrypt0(mk, info._kek, aad)
444442
const kek = AesGcmKey.fromBytes(data)
445443
data = await coseA256GCMDecrypt0(kek, info.dek as Uint8Array, aad)
446444
dek = AesGcmKey.fromBytes(data)
447-
info._invalidKEK = false
448445
this._channelDEKs.set(`${info.canister.toText()}:${info.id}`, dek)
449446
}
450447

@@ -719,7 +716,6 @@ export class MyMessageState {
719716
return {
720717
...ninfo,
721718
_kek: kek,
722-
_invalidKEK: info._invalidKEK,
723719
_managers: ninfo.managers.map((m) => m.toText())
724720
}
725721
}
@@ -761,12 +757,23 @@ export class MyMessageState {
761757
const channel = await this.agent.subscribeChannel(canister, id)
762758
const kek = await this.loadChannelKEK(canister, id).catch((e) => null)
763759
return derived(channel, ($channel, set) => {
764-
set({
765-
...$channel,
766-
_kek: kek,
767-
_invalidKEK: false,
768-
_managers: $channel.managers.map((m) => m.toText())
769-
})
760+
if (kek) {
761+
set({
762+
...$channel,
763+
_kek: kek,
764+
_managers: $channel.managers.map((m) => m.toText())
765+
})
766+
} else {
767+
this.loadChannelKEK(canister, id)
768+
.catch((e) => null)
769+
.then((kek) => {
770+
set({
771+
...$channel,
772+
_kek: kek,
773+
_managers: $channel.managers.map((m) => m.toText())
774+
})
775+
})
776+
}
770777
})
771778
}
772779

0 commit comments

Comments
 (0)