Skip to content

Commit b5b9da8

Browse files
Max-7NicoTuxx
authored andcommitted
[MS] Shamir recovery
1 parent 8ef1d40 commit b5b9da8

40 files changed

Lines changed: 1495 additions & 157 deletions

client/src/common/validators.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,8 +213,9 @@ export const claimAndBootstrapLinkValidator: IValidator = async function (value:
213213
result.value.tag === ParsedParsecAddrTag.InvitationUser ||
214214
result.value.tag === ParsedParsecAddrTag.InvitationDevice ||
215215
result.value.tag === ParsedParsecAddrTag.AsyncEnrollment ||
216-
// Not a join link but it we can use it as a backup
217-
result.value.tag === ParsedParsecAddrTag.TOTPReset)
216+
// Not join links but we can use this as a backup
217+
result.value.tag === ParsedParsecAddrTag.TOTPReset ||
218+
result.value.tag === ParsedParsecAddrTag.InvitationShamirRecovery)
218219
) {
219220
return { validity: Validity.Valid };
220221
}
@@ -336,3 +337,17 @@ export const totpResetLinkValidator: IValidator = async function (value: string)
336337
}
337338
return { validity: Validity.Invalid, reason: 'HomePage.organizationRequest.totp.invalidLink' };
338339
};
340+
341+
export const shamirRecoveryLinkValidator: IValidator = async function (value: string) {
342+
value = value.trim();
343+
if (value.length === 0) {
344+
return { validity: Validity.Intermediate };
345+
}
346+
const result = await parseParsecAddr(value);
347+
if (result.ok) {
348+
return result.value.tag === ParsedParsecAddrTag.InvitationShamirRecovery
349+
? { validity: Validity.Valid }
350+
: { validity: Validity.Invalid };
351+
}
352+
return { validity: Validity.Invalid, reason: 'HomePage.shamir.invalidLink' };
353+
};

client/src/components/devices/ChooseAuthentication.vue

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,7 +166,6 @@ import {
166166
DevicePrimaryProtectionStrategyTag,
167167
DeviceSaveStrategy,
168168
OpenBaoAuthConfigTag,
169-
ParsecAddr,
170169
PrimaryProtectionStrategy,
171170
ServerConfig,
172171
constructSaveStrategy,
@@ -198,7 +197,6 @@ const props = defineProps<{
198197
showTitle?: boolean;
199198
activeAuth?: DevicePrimaryProtectionStrategyTag;
200199
serverConfig?: ServerConfig;
201-
serverAddr: ParsecAddr;
202200
}>();
203201
204202
defineExpose({

client/src/components/profile/types.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,3 @@ export enum AuthenticationCardState {
1010
Unavailable = 'unavailable',
1111
Forbidden = 'forbidden',
1212
}
13-
14-
export enum ShamirTab {
15-
Self = 'shamir-tab-self',
16-
Others = 'shamir-tab-others',
17-
}
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
<!-- Parsec Cloud (https://parsec.cloud) Copyright (c) BUSL-1.1 2016-present Scille SAS -->
2+
3+
<template>
4+
<div
5+
v-if="step === Steps.ChooseCode"
6+
class="choose-code"
7+
>
8+
<sas-code-choice
9+
:choices="claimer.greeterSasChoices"
10+
@select="selectGreeterCode"
11+
/>
12+
</div>
13+
14+
<div
15+
v-if="step === Steps.ProvideCode"
16+
class="provide-code"
17+
>
18+
<sas-code-provide :code="claimer.claimerSasCode" />
19+
</div>
20+
</template>
21+
22+
<script lang="ts">
23+
export enum CodeExchangeInterruptedReason {
24+
NoCodeSelected = 'no-code-selected',
25+
WrongCodeSelected = 'wrong-code-selected',
26+
SignifyTrustFailed = 'signify-trust-failed',
27+
WaitTrustFailed = 'wait-trust-failed',
28+
}
29+
</script>
30+
31+
<script setup lang="ts">
32+
import SasCodeChoice from '@/components/sas-code/SasCodeChoice.vue';
33+
import SasCodeProvide from '@/components/sas-code/SasCodeProvide.vue';
34+
import { ShamirClaimer } from '@/parsec';
35+
import { nextTick, ref } from 'vue';
36+
37+
enum Steps {
38+
ChooseCode = 'shamir-guest-choose-code',
39+
ProvideCode = 'shamir-guest-provide-code',
40+
}
41+
42+
const step = ref<Steps>(Steps.ChooseCode);
43+
44+
const props = defineProps<{
45+
claimer: ShamirClaimer;
46+
}>();
47+
48+
const emits = defineEmits<{
49+
(e: 'interrupted', reason: CodeExchangeInterruptedReason): void;
50+
(e: 'codeExchanged'): void;
51+
}>();
52+
53+
async function selectGreeterCode(code: string | null): Promise<void> {
54+
if (code === null) {
55+
await props.claimer.denyTrust();
56+
emits('interrupted', CodeExchangeInterruptedReason.NoCodeSelected);
57+
return;
58+
}
59+
if (code !== props.claimer.greeterSasCode) {
60+
await props.claimer.denyTrust();
61+
emits('interrupted', CodeExchangeInterruptedReason.WrongCodeSelected);
62+
return;
63+
}
64+
console.log('SIGNIFY TRUST');
65+
const result = await props.claimer.signifyTrust();
66+
if (!result) {
67+
emits('interrupted', CodeExchangeInterruptedReason.SignifyTrustFailed);
68+
return;
69+
}
70+
console.log('SIGNIFY TRUST RETURNED');
71+
step.value = Steps.ProvideCode;
72+
await nextTick();
73+
console.log('WAIT TRUST', props.claimer.claimerSasCode);
74+
const waitResult = await props.claimer.waitGreeterTrust();
75+
if (!waitResult.ok) {
76+
emits('interrupted', CodeExchangeInterruptedReason.WaitTrustFailed);
77+
return;
78+
}
79+
emits('codeExchanged');
80+
}
81+
</script>
82+
83+
<style scoped lang="scss"></style>
File renamed without changes.

client/src/components/profile/ShamirSelf.vue renamed to client/src/components/shamir/ShamirSelf.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,8 @@
2626
</template>
2727

2828
<script setup lang="ts">
29-
import ShamirSelfDisplay from '@/components/profile/ShamirSelfDisplay.vue';
30-
import ShamirSetup from '@/components/profile/ShamirSetup.vue';
29+
import ShamirSelfDisplay from '@/components/shamir/ShamirSelfDisplay.vue';
30+
import ShamirSetup from '@/components/shamir/ShamirSetup.vue';
3131
import { getSelfShamirRecovery, SelfShamirRecoveryInfo, SelfShamirRecoveryInfoTag } from '@/parsec';
3232
import { InformationManager } from '@/services/informationManager';
3333
import { MsReportText, MsReportTheme } from 'megashark-lib';

client/src/components/profile/ShamirSelfDisplay.vue renamed to client/src/components/shamir/ShamirSelfDisplay.vue

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,8 @@
123123

124124
<script setup lang="ts">
125125
import ShamirIconCircle from '@/assets/images/shamir-icon-circle.svg?raw';
126-
import { SelfShamirRecoveryInfo } from '@/parsec';
126+
import { SelfShamirRecoveryInfo, SelfShamirRecoveryInfoTag } from '@/parsec';
127127
import { deleteSelfShamirRecovery } from '@/parsec/shamir';
128-
import { SelfShamirRecoveryInfoTag } from '@/plugins/libparsec';
129128
import { IonButton, IonIcon, IonItem, IonList, IonText } from '@ionic/vue';
130129
import { checkmarkCircle, informationCircle, shieldCheckmark } from 'ionicons/icons';
131130
import { Answer, askQuestion, MsImage, MsReportText, MsReportTheme } from 'megashark-lib';

client/src/components/profile/ShamirSetup.vue renamed to client/src/components/shamir/ShamirSetup.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@
210210

211211
<script setup lang="ts">
212212
import ShamirIconCircle from '@/assets/images/shamir-icon-circle.svg?raw';
213-
import ShamirSetupSearchDropdown from '@/components/profile/ShamirSetupSearchDropdown.vue';
213+
import ShamirSetupSearchDropdown from '@/components/shamir/ShamirSetupSearchDropdown.vue';
214214
import { getClientInfo, listUsers, UserInfo, UserProfile } from '@/parsec';
215215
import { getRequiredShamirThreshold, setupShamirRecovery } from '@/parsec/shamir';
216216
import { Information, InformationLevel, InformationManager, PresentationMode } from '@/services/informationManager';

client/src/components/profile/ShamirSetupSearchDropdown.vue renamed to client/src/components/shamir/ShamirSetupSearchDropdown.vue

File renamed without changes.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
// Parsec Cloud (https://parsec.cloud) Copyright (c) BUSL-1.1 2016-present Scille SAS
2+
3+
export enum ShamirTab {
4+
Self = 'shamir-tab-self',
5+
Others = 'shamir-tab-others',
6+
}
7+
8+
export enum ShamirAction {
9+
Greet = 'shamir-action-greet',
10+
}

0 commit comments

Comments
 (0)