Skip to content

Commit 55de935

Browse files
committed
[MS] Replaced pki mocks with bindings
Co-Authored-By: fabienSvstr <[email protected]>
1 parent 128caef commit 55de935

File tree

21 files changed

+1383
-603
lines changed

21 files changed

+1383
-603
lines changed

client/electron/src/setup.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ export class ElectronCapacitorApp {
555555
this.MainWindow.webContents.on('dom-ready', () => {
556556
setTimeout(() => {
557557
if (electronIsDev || process.env.OPEN_DEV_TOOLS == 'true') {
558-
this.MainWindow.webContents.openDevTools();
558+
this.MainWindow.webContents.openDevTools({ mode: 'detach' });
559559
}
560560
CapElectronEventEmitter.emit('CAPELECTRON_DeeplinkListenerInitialized', '');
561561
}, 400);

client/src/common/validators.ts

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -131,17 +131,14 @@ export const claimAndBootstrapLinkValidator: IValidator = async function (value:
131131
if (value.length === 0) {
132132
return { validity: Validity.Intermediate };
133133
}
134-
// TODO: REPLACE WHEN LIBPARSEC HANDLES PKI LINKS
135-
if (value.includes('a=pki_enrollment')) {
136-
return { validity: Validity.Valid };
137-
}
138134
const result = await parseParsecAddr(value);
139135

140136
if (
141137
result.ok &&
142138
(result.value.tag === ParsedParsecAddrTag.OrganizationBootstrap ||
143139
result.value.tag === ParsedParsecAddrTag.InvitationUser ||
144-
result.value.tag === ParsedParsecAddrTag.InvitationDevice)
140+
result.value.tag === ParsedParsecAddrTag.InvitationDevice ||
141+
result.value.tag === ParsedParsecAddrTag.PkiEnrollment)
145142
) {
146143
return { validity: Validity.Valid };
147144
}
@@ -245,9 +242,9 @@ export const pkiLinkValidator: IValidator = async function (value: string) {
245242
if (value.length === 0) {
246243
return { validity: Validity.Intermediate };
247244
}
248-
// TODO: REPLACE WHEN LIBPARSEC HANDLES PKI LINKS
249-
if (value.includes('a=pki_enrollment')) {
250-
return { validity: Validity.Valid };
245+
const result = await parseParsecAddr(value);
246+
if (result.ok) {
247+
return result.value.tag === ParsedParsecAddrTag.PkiEnrollment ? { validity: Validity.Valid } : { validity: Validity.Invalid };
251248
}
252-
return { validity: Validity.Invalid };
249+
return { validity: Validity.Invalid, reason: '' };
253250
};

client/src/components/devices/ChooseAuthentication.vue

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
</ion-radio>
4949

5050
<ion-radio
51-
v-show="smartcardAvailable"
5251
class="item-radio radio-list-item"
5352
label-placement="end"
5453
justify="start"

client/src/components/invitations/PkiRequestItem.vue

Lines changed: 24 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,20 +9,21 @@
99
<!-- request - mobile version -->
1010
<div
1111
class="pkiRequest-mobile"
12-
v-if="isSmallDisplay"
12+
v-if="isSmallDisplay && request.tag === PkiEnrollmentListItemTag.Valid"
1313
>
1414
<div class="pkiRequest-mobile-header">
15-
<ion-text class="pkiRequest-mobile-header__name subtitles-normal">{{ request.humanHandle.label }}</ion-text>
16-
<ion-text class="pkiRequest-mobile-header__email button-medium">{{ request.humanHandle.email }}</ion-text>
15+
<ion-text class="pkiRequest-mobile-header__name subtitles-normal">
16+
{{ (request as PkiEnrollmentListItemValid).payload.humanHandle.label }}
17+
</ion-text>
18+
<ion-text class="pkiRequest-mobile-header__email button-medium">
19+
{{ (request as PkiEnrollmentListItemValid).payload.humanHandle.email }}
20+
</ion-text>
1721
</div>
1822
<div class="pkiRequest-mobile-content">
1923
<ion-text class="pkiRequest-mobile-content__createdOn body-sm">
20-
{{ $msTranslate(formatTimeSince(request.createdOn, '--', 'short')) }}
24+
{{ $msTranslate(formatTimeSince(request.submittedOn, '--', 'short')) }}
2125
</ion-text>
22-
<div
23-
class="certificate button-small"
24-
:class="`certificate-${request.validity}`"
25-
>
26+
<div class="certificate button-small certificate-valid">
2627
<ion-icon
2728
:icon="validity.icon"
2829
class="certificate-icon"
@@ -35,23 +36,23 @@
3536
<!-- request avatar -->
3637
<div
3738
class="pkiRequest-name"
38-
v-if="isLargeDisplay"
39+
v-if="isLargeDisplay && request.tag === PkiEnrollmentListItemTag.Valid"
3940
>
4041
<ion-text class="pkiRequest-name__label cell">
4142
<user-avatar-name
42-
:user-avatar="request.humanHandle.label"
43-
:user-name="request.humanHandle.label"
43+
:user-avatar="(request as PkiEnrollmentListItemValid).payload.humanHandle.label"
44+
:user-name="(request as PkiEnrollmentListItemValid).payload.humanHandle.label"
4445
/>
4546
</ion-text>
4647
</div>
4748

4849
<!-- request mail -->
4950
<div
5051
class="pkiRequest-email"
51-
v-if="isLargeDisplay"
52+
v-if="isLargeDisplay && request.tag === PkiEnrollmentListItemTag.Valid"
5253
>
5354
<ion-text class="pkiRequest-email__label cell">
54-
{{ request.humanHandle.email }}
55+
{{ (request as PkiEnrollmentListItemValid).payload.humanHandle.email }}
5556
</ion-text>
5657
</div>
5758

@@ -61,20 +62,17 @@
6162
v-if="isLargeDisplay"
6263
>
6364
<ion-text class="pkiRequest-createdOn__label cell">
64-
{{ $msTranslate(formatTimeSince(request.createdOn, '--', 'short')) }}
65+
{{ $msTranslate(formatTimeSince(request.submittedOn, '--', 'short')) }}
6566
</ion-text>
6667
</div>
6768

6869
<!-- request certificate -->
6970
<div
7071
class="pkiRequest-certificate"
71-
v-if="isLargeDisplay"
72+
v-if="isLargeDisplay && request.tag === PkiEnrollmentListItemTag.Valid"
7273
>
7374
<ion-text class="pkiRequest-certificate__label cell">
74-
<div
75-
class="certificate button-small"
76-
:class="`certificate-${request.validity}`"
77-
>
75+
<div class="certificate button-small certificate-valid">
7876
<ion-icon
7977
:icon="validity.icon"
8078
class="certificate-icon"
@@ -112,31 +110,29 @@
112110

113111
<script setup lang="ts">
114112
import UserAvatarName from '@/components/users/UserAvatarName.vue';
115-
import { JoinRequestValidity, OrganizationJoinRequest } from '@/parsec';
113+
import { PkiEnrollmentListItem, PkiEnrollmentListItemTag, PkiEnrollmentListItemValid } from '@/parsec';
116114
import { IonButton, IonIcon, IonItem, IonText } from '@ionic/vue';
117-
import { checkmarkCircle, closeCircle, warning } from 'ionicons/icons';
115+
import { checkmarkCircle, closeCircle } from 'ionicons/icons';
118116
import { attachMouseOverTooltip, formatTimeSince, useWindowSize } from 'megashark-lib';
119117
import { computed, onMounted, useTemplateRef } from 'vue';
120118
121119
const { isSmallDisplay, isLargeDisplay } = useWindowSize();
122120
const rejectButtonRef = useTemplateRef<InstanceType<typeof IonButton>>('rejectButton');
123121
124122
const props = defineProps<{
125-
request: OrganizationJoinRequest;
123+
request: PkiEnrollmentListItem;
126124
}>();
127125
128126
defineEmits<{
129-
(e: 'acceptClick', invitation: OrganizationJoinRequest): void;
130-
(e: 'rejectClick', invitation: OrganizationJoinRequest): void;
127+
(e: 'acceptClick', invitation: PkiEnrollmentListItem): void;
128+
(e: 'rejectClick', invitation: PkiEnrollmentListItem): void;
131129
}>();
132130
133131
const validity = computed(() => {
134-
if (props.request.validity === JoinRequestValidity.Valid) {
132+
if (props.request.tag === PkiEnrollmentListItemTag.Valid) {
135133
return { text: 'InvitationsPage.pkiRequests.certificate.valid', icon: checkmarkCircle };
136-
} else if (props.request.validity === JoinRequestValidity.Invalid) {
137-
return { text: 'InvitationsPage.pkiRequests.certificate.invalid', icon: closeCircle };
138134
} else {
139-
return { text: 'InvitationsPage.pkiRequests.certificate.unknown', icon: warning };
135+
return { text: 'InvitationsPage.pkiRequests.certificate.invalid', icon: closeCircle };
140136
}
141137
});
142138

client/src/components/organizations/OrganizationPkiRequest.vue

Lines changed: 57 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,29 +3,39 @@
33
<template>
44
<div
55
class="organization-request"
6-
:class="request.status"
6+
:class="{
7+
pending: request.info.tag === PKIInfoItemTag.Submitted,
8+
rejected: request.info.tag === PKIInfoItemTag.Rejected,
9+
accepted: request.info.tag === PKIInfoItemTag.Accepted,
10+
cancelled: request.info.tag === PKIInfoItemTag.Cancelled,
11+
}"
712
>
813
<ion-card-content class="organization-request-content">
914
<div class="organization-request-info">
10-
<ion-text class="organization-request-organization title-h4">{{ request.organization }}</ion-text>
11-
<ion-text class="organization-request-username body">{{ request.humanHandle.label }}</ion-text>
15+
<ion-text class="organization-request-organization title-h4">{{ addr?.organizationId ?? '' }}</ion-text>
16+
<ion-text class="organization-request-username body">{{ request.enrollment.payload.humanHandle.label }}</ion-text>
1217
</div>
1318
<div class="organization-request-status-container">
1419
<ion-text
1520
class="organization-request-status button-small"
16-
:class="`status-${request.status}`"
17-
ref="statusText"
21+
:class="{
22+
'status-pending': request.info.tag === PKIInfoItemTag.Submitted,
23+
'status-rejected': request.info.tag === PKIInfoItemTag.Rejected,
24+
'status-accepted': request.info.tag === PKIInfoItemTag.Accepted,
25+
'status-cancelled': request.info.tag === PKIInfoItemTag.Cancelled,
26+
}"
27+
ref="statusTextEl"
1828
>
1929
<span v-if="statusText">{{ $msTranslate(statusText) }}</span>
2030
</ion-text>
2131
<ion-icon
22-
v-if="request.status !== JoinRequestStatus.Accepted"
32+
v-if="request.info.tag !== PKIInfoItemTag.Accepted"
2333
@click="$emit('deleteRequest', request)"
2434
:icon="closeCircle"
2535
class="organization-request-icon"
2636
/>
2737
<ion-button
28-
v-if="request.status === JoinRequestStatus.Accepted"
38+
v-if="request.info.tag === PKIInfoItemTag.Accepted"
2939
fill="clear"
3040
class="organization-request-button"
3141
@click="$emit('joinOrganization', request)"
@@ -42,49 +52,61 @@
4252
</template>
4353

4454
<script lang="ts" setup>
45-
import { JoinRequestStatus, LocalJoinRequest } from '@/parsec';
55+
import { ParsedParsecAddrPkiEnrollment, ParsedParsecAddrTag, parseParsecAddr, PKIInfoItemTag, PkiLocalRequest } from '@/parsec';
4656
import { IonButton, IonCardContent, IonIcon, IonText } from '@ionic/vue';
4757
import { arrowForward, closeCircle } from 'ionicons/icons';
4858
import { attachMouseOverTooltip } from 'megashark-lib';
49-
import { computed, onMounted, useTemplateRef, watch } from 'vue';
59+
import { computed, onMounted, ref, useTemplateRef, watch } from 'vue';
5060
51-
const statusTextRef = useTemplateRef<InstanceType<typeof IonText>>('statusText');
61+
const statusTextRef = useTemplateRef<InstanceType<typeof IonText>>('statusTextEl');
62+
const addr = ref<ParsedParsecAddrPkiEnrollment | undefined>(undefined);
5263
5364
const props = defineProps<{
54-
request: LocalJoinRequest;
65+
request: PkiLocalRequest;
5566
}>();
5667
5768
onMounted(async () => {
58-
if (statusTextRef.value && props.request.status === JoinRequestStatus.Pending) {
59-
attachMouseOverTooltip(statusTextRef.value.$el, 'HomePage.organizationRequest.pending.tooltip');
60-
} else if (statusTextRef.value && props.request.status === JoinRequestStatus.Rejected) {
61-
attachMouseOverTooltip(statusTextRef.value.$el, 'HomePage.organizationRequest.rejected.tooltip');
69+
attachTooltip(statusTextRef.value?.$el, props.request.info.tag);
70+
const addrResult = await parseParsecAddr(props.request.enrollment.addr);
71+
if (addrResult.ok && addrResult.value.tag === ParsedParsecAddrTag.PkiEnrollment) {
72+
addr.value = addrResult.value;
6273
}
6374
});
6475
6576
watch(
66-
() => props.request.status,
77+
() => props.request.info.tag,
6778
(newStatus) => {
68-
if (statusTextRef.value && newStatus === JoinRequestStatus.Pending) {
69-
attachMouseOverTooltip(statusTextRef.value.$el, 'HomePage.organizationRequest.pending.tooltip');
70-
} else if (statusTextRef.value && newStatus === JoinRequestStatus.Rejected) {
71-
attachMouseOverTooltip(statusTextRef.value.$el, 'HomePage.organizationRequest.rejected.tooltip');
72-
}
79+
attachTooltip(statusTextRef.value?.$el, newStatus);
7380
},
7481
);
7582
83+
function attachTooltip(el: HTMLElement | undefined, status: PKIInfoItemTag): void {
84+
if (!el) {
85+
return;
86+
}
87+
if (status === PKIInfoItemTag.Submitted) {
88+
attachMouseOverTooltip(el, 'HomePage.organizationRequest.pending.tooltip');
89+
} else if (status === PKIInfoItemTag.Rejected) {
90+
attachMouseOverTooltip(el, 'HomePage.organizationRequest.rejected.tooltip');
91+
} else if (status === PKIInfoItemTag.Cancelled) {
92+
attachMouseOverTooltip(el, 'HomePage.organizationRequest.cancelled.tooltip');
93+
} else if (status === PKIInfoItemTag.Accepted) {
94+
attachMouseOverTooltip(el, 'HomePage.organizationRequest.accepted.tooltip');
95+
}
96+
}
97+
7698
defineEmits<{
77-
(e: 'joinOrganization', request: LocalJoinRequest): void;
78-
(e: 'deleteRequest', request: LocalJoinRequest): void;
99+
(e: 'joinOrganization', request: PkiLocalRequest): void;
100+
(e: 'deleteRequest', request: PkiLocalRequest): void;
79101
}>();
80102
81103
const statusText = computed(() => {
82-
switch (props.request.status) {
83-
case JoinRequestStatus.Pending:
104+
switch (props.request.info.tag) {
105+
case PKIInfoItemTag.Submitted:
84106
return 'HomePage.organizationRequest.status.pending';
85-
case JoinRequestStatus.Rejected:
107+
case PKIInfoItemTag.Rejected:
86108
return 'HomePage.organizationRequest.status.rejected';
87-
case JoinRequestStatus.Cancelled:
109+
case PKIInfoItemTag.Cancelled:
88110
return 'HomePage.organizationRequest.status.cancelled';
89111
default:
90112
return undefined;
@@ -149,16 +171,20 @@ const statusText = computed(() => {
149171
padding: 0.125rem 0.5rem;
150172
flex-shrink: 0;
151173
152-
&.status-pending {
174+
&.status-cancelled {
153175
background-color: var(--parsec-color-light-secondary-grey);
154176
color: var(--parsec-color-light-secondary-white);
155177
}
156178
157-
&.status-rejected,
158-
&.status-cancelled {
179+
&.status-rejected {
159180
background-color: var(--parsec-color-light-danger-500);
160181
color: var(--parsec-color-light-secondary-white);
161182
}
183+
184+
&.status-pending {
185+
background-color: var(--parsec-color-light-warning-100);
186+
color: var(--parsec-color-light-warning-700);
187+
}
162188
}
163189
164190
.organization-request-icon {
@@ -205,7 +231,7 @@ const statusText = computed(() => {
205231
border-color: var(--parsec-color-light-secondary-light);
206232
207233
.organization-request-icon {
208-
color: var(--parsec-color-light-secondary-light);
234+
color: var(--parsec-color-light-secondary-grey);
209235
210236
&:hover {
211237
color: var(--parsec-color-light-secondary-text);

client/src/components/users/UserInformation.vue

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,22 @@ defineExpose({
6464
email,
6565
fullName,
6666
setFocus,
67+
getEmail,
68+
getFullName,
6769
});
6870
6971
async function setFocus(): Promise<void> {
7072
await firstInputFieldRef.value?.setFocus();
7173
}
7274
75+
function getEmail(): string {
76+
return email.value;
77+
}
78+
79+
function getFullName(): string {
80+
return fullName.value;
81+
}
82+
7383
async function areFieldsCorrect(): Promise<boolean> {
7484
return (
7585
(await emailValidator(email.value)).validity === Validity.Valid && (await userNameValidator(fullName.value)).validity === Validity.Valid

0 commit comments

Comments
 (0)