aboutsummaryrefslogtreecommitdiffstats
path: root/packages/shared/src/stores/ServiceBase.ts
diff options
context:
space:
mode:
Diffstat (limited to 'packages/shared/src/stores/ServiceBase.ts')
-rw-r--r--packages/shared/src/stores/ServiceBase.ts55
1 files changed, 50 insertions, 5 deletions
diff --git a/packages/shared/src/stores/ServiceBase.ts b/packages/shared/src/stores/ServiceBase.ts
index a19f59e..0e4be97 100644
--- a/packages/shared/src/stores/ServiceBase.ts
+++ b/packages/shared/src/stores/ServiceBase.ts
@@ -25,6 +25,14 @@ import type Profile from './Profile';
25import ServiceSettingsBase from './ServiceSettingsBase'; 25import ServiceSettingsBase from './ServiceSettingsBase';
26import ServiceState from './ServiceState'; 26import ServiceState from './ServiceState';
27 27
28export enum SecurityLabelKind {
29 Empty = 'empty',
30 SecureConnection = 'secureConnection',
31 NotSecureConnection = 'notSecureConnection',
32 CertificateError = 'certificateError',
33 InvalidURL = 'invalidURL',
34}
35
28export function defineServiceModel<TS extends IAnyModelType>(settings: TS) { 36export function defineServiceModel<TS extends IAnyModelType>(settings: TS) {
29 return types 37 return types
30 .model('Service', { 38 .model('Service', {
@@ -48,6 +56,38 @@ export function defineServiceModel<TS extends IAnyModelType>(settings: TS) {
48 get crashed(): boolean { 56 get crashed(): boolean {
49 return self.state.type === 'crashed'; 57 return self.state.type === 'crashed';
50 }, 58 },
59 isCertificateTemporarilyTrusted(
60 certificate: CertificateSnapshotIn,
61 ): boolean {
62 return (
63 self.settings.profile as Profile
64 ).isCertificateTemporarilyTrusted(certificate);
65 },
66 get securityLabel(): SecurityLabelKind {
67 const {
68 state: { type: stateType },
69 currentUrl,
70 } = self;
71 if (stateType === 'certificateError') {
72 return SecurityLabelKind.CertificateError;
73 }
74 if (currentUrl === undefined || currentUrl === '') {
75 return SecurityLabelKind.Empty;
76 }
77 try {
78 const parsedUrl = new URL(currentUrl);
79 switch (parsedUrl.protocol) {
80 case 'https:':
81 return SecurityLabelKind.SecureConnection;
82 case 'http:':
83 return SecurityLabelKind.NotSecureConnection;
84 default:
85 return SecurityLabelKind.InvalidURL;
86 }
87 } catch {
88 return SecurityLabelKind.InvalidURL;
89 }
90 },
51 })) 91 }))
52 .views((self) => ({ 92 .views((self) => ({
53 get hasError(): boolean { 93 get hasError(): boolean {
@@ -57,12 +97,17 @@ export function defineServiceModel<TS extends IAnyModelType>(settings: TS) {
57 self.state.type === 'certificateError' 97 self.state.type === 'certificateError'
58 ); 98 );
59 }, 99 },
60 isCertificateTemporarilyTrusted( 100 get hasSecurityLabelWarning(): boolean {
61 certificate: CertificateSnapshotIn, 101 const { securityLabel } = self;
62 ): boolean {
63 return ( 102 return (
64 self.settings.profile as Profile 103 securityLabel !== SecurityLabelKind.Empty &&
65 ).isCertificateTemporarilyTrusted(certificate); 104 securityLabel !== SecurityLabelKind.SecureConnection
105 );
106 },
107 }))
108 .views((self) => ({
109 get alwaysShowLocationBar(): boolean {
110 return self.hasError || self.hasSecurityLabelWarning;
66 }, 111 },
67 })); 112 }));
68} 113}