diff options
Diffstat (limited to 'packages/shared/src/stores/ServiceBase.ts')
-rw-r--r-- | packages/shared/src/stores/ServiceBase.ts | 55 |
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'; | |||
25 | import ServiceSettingsBase from './ServiceSettingsBase'; | 25 | import ServiceSettingsBase from './ServiceSettingsBase'; |
26 | import ServiceState from './ServiceState'; | 26 | import ServiceState from './ServiceState'; |
27 | 27 | ||
28 | export enum SecurityLabelKind { | ||
29 | Empty = 'empty', | ||
30 | SecureConnection = 'secureConnection', | ||
31 | NotSecureConnection = 'notSecureConnection', | ||
32 | CertificateError = 'certificateError', | ||
33 | InvalidURL = 'invalidURL', | ||
34 | } | ||
35 | |||
28 | export function defineServiceModel<TS extends IAnyModelType>(settings: TS) { | 36 | export 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 | } |