1
- import React , { useContext , useState } from 'react' ;
1
+ import React , { useContext , useEffect , useState } from 'react' ;
2
2
import { settingsWrapper } from '../../AppSettingsForm' ;
3
3
import { Field , FormikProps } from 'formik' ;
4
- import RadioButtonNoFormik from '../../../../../components/form-controls/RadioButtonNoFormik' ;
5
4
import { useTranslation } from 'react-i18next' ;
6
5
import { PermissionsContext , SiteContext } from '../../Contexts' ;
7
6
import TextField from '../../../../../components/form-controls/TextField' ;
8
- import { Stack , PanelType , IChoiceGroupOption } from '@fluentui/react' ;
7
+ import { Stack , PanelType , IChoiceGroupOption , MessageBarType } from '@fluentui/react' ;
9
8
import IconButton from '../../../../../components/IconButton/IconButton' ;
10
9
import EditClientExclusionPaths from './EditClientExclusionPaths' ;
11
10
import { AppSettingsFormValues } from '../../AppSettings.types' ;
12
11
import { ScenarioService } from '../../../../../utils/scenario-checker/scenario.service' ;
13
12
import { ScenarioIds } from '../../../../../utils/scenario-checker/scenario-ids' ;
14
13
import CustomPanel from '../../../../../components/CustomPanel/CustomPanel' ;
15
- import { ClientCertMode , Site } from '../../../../../models/site/site' ;
14
+ import { ClientCertMode , MinTlsVersion , Site } from '../../../../../models/site/site' ;
16
15
import { ArmObj } from '../../../../../models/arm-obj' ;
17
-
18
- enum CompositeClientCertMode {
19
- Require = 'Require' ,
20
- Allow = 'Allow' ,
21
- Optional = 'Optional' ,
22
- Ignore = 'Ignore' ,
23
- }
16
+ import RadioButton from '../../../../../components/form-controls/RadioButton' ;
17
+ import CustomBanner from '../../../../../components/CustomBanner/CustomBanner' ;
24
18
25
19
const ClientCert : React . FC < FormikProps < AppSettingsFormValues > > = props => {
26
20
const { values, setFieldValue, initialValues } = props ;
@@ -29,53 +23,18 @@ const ClientCert: React.FC<FormikProps<AppSettingsFormValues>> = props => {
29
23
const { app_write, editable, saving } = useContext ( PermissionsContext ) ;
30
24
const disableAllControls = ! app_write || ! editable || saving ;
31
25
const [ showPanel , setShowPanel ] = useState ( false ) ;
32
-
33
- const onClientCertModeChange = ( e : any , newValue : IChoiceGroupOption ) => {
34
- switch ( newValue . key ) {
35
- case CompositeClientCertMode . Require :
36
- setFieldValue ( 'site.properties.clientCertEnabled' , true ) ;
37
- setFieldValue ( 'site.properties.clientCertMode' , ClientCertMode . Required ) ;
38
- break ;
39
- case CompositeClientCertMode . Allow :
40
- setFieldValue ( 'site.properties.clientCertEnabled' , true ) ;
41
- setFieldValue ( 'site.properties.clientCertMode' , ClientCertMode . Optional ) ;
42
- break ;
43
- case CompositeClientCertMode . Optional :
44
- setFieldValue ( 'site.properties.clientCertEnabled' , true ) ;
45
- setFieldValue ( 'site.properties.clientCertMode' , ClientCertMode . OptionalInteractiveUser ) ;
46
- break ;
47
- case CompositeClientCertMode . Ignore :
48
- setFieldValue ( 'site.properties.clientCertEnabled' , false ) ;
49
- break ;
50
- default :
51
- setFieldValue ( 'site.properties.clientCertEnabled' , false ) ;
52
- break ;
53
- }
54
- } ;
55
-
56
- const getCompositeClientCertMode = ( siteArm : ArmObj < Site > ) : CompositeClientCertMode => {
57
- if ( siteArm . properties . clientCertEnabled ) {
58
- return siteArm . properties . clientCertMode === ClientCertMode . Required
59
- ? CompositeClientCertMode . Require
60
- : siteArm . properties . clientCertMode === ClientCertMode . Optional
61
- ? CompositeClientCertMode . Allow
62
- : CompositeClientCertMode . Optional ;
63
- }
64
-
65
- return CompositeClientCertMode . Ignore ;
66
- } ;
26
+ const [ disableOptionalInteractiveUserOption , setDisableOptionalInteractiveUserOption ] = useState ( false ) ;
27
+ const [ clientCertWarningMessage , setClientCertWarningMessage ] = useState ( '' ) ;
67
28
68
29
const getClientCertInfoBubbleMessage = ( siteArm : ArmObj < Site > ) : string => {
69
- const mode = getCompositeClientCertMode ( siteArm ) ;
70
-
71
- switch ( mode ) {
72
- case CompositeClientCertMode . Require :
30
+ switch ( siteArm . properties . clientCertMode ) {
31
+ case ClientCertMode . Required :
73
32
return t ( 'clientCertificateModeRequiredInfoBubbleMessage' ) ;
74
- case CompositeClientCertMode . Allow :
75
- return t ( 'clientCertificateModeAllowInfoBubbleMessage' ) ;
76
- case CompositeClientCertMode . Optional :
33
+ case ClientCertMode . Optional :
77
34
return t ( 'clientCertificateModeOptionalInfoBubbleMessage' ) ;
78
- case CompositeClientCertMode . Ignore :
35
+ case ClientCertMode . OptionalInteractiveUser :
36
+ return t ( 'clientCertificateModeOptionalInteractiveUserInfoBubbleMessage' ) ;
37
+ case ClientCertMode . Ignore :
79
38
return t ( 'clientCertificateModeIgnoreInfoBubbleMessage' ) ;
80
39
default :
81
40
return '' ;
@@ -84,6 +43,7 @@ const ClientCert: React.FC<FormikProps<AppSettingsFormValues>> = props => {
84
43
85
44
const scenarioChecker = new ScenarioService ( t ) ;
86
45
const clientCertEnabled = scenarioChecker . checkScenario ( ScenarioIds . incomingClientCertEnabled , { site } ) ;
46
+
87
47
const openClientExclusionPathPanel = ( ) => {
88
48
setShowPanel ( true ) ;
89
49
} ;
@@ -95,38 +55,55 @@ const ClientCert: React.FC<FormikProps<AppSettingsFormValues>> = props => {
95
55
setShowPanel ( false ) ;
96
56
} ;
97
57
58
+ useEffect ( ( ) => {
59
+ const http20EnabledOrMinTLSVersion13 =
60
+ values . config . properties . http20Enabled || values . config . properties . minTlsVersion === MinTlsVersion . tLS13 ;
61
+ const isClientCertModeOptionalInteractiveUser = values . site . properties . clientCertMode === ClientCertMode . OptionalInteractiveUser ;
62
+
63
+ setDisableOptionalInteractiveUserOption ( http20EnabledOrMinTLSVersion13 ) ;
64
+ setClientCertWarningMessage ( http20EnabledOrMinTLSVersion13 ? t ( 'clientCertificateWarningMessage' ) : '' ) ;
65
+ if ( isClientCertModeOptionalInteractiveUser && http20EnabledOrMinTLSVersion13 ) {
66
+ setFieldValue ( 'site.properties.clientCertMode' , ClientCertMode . Ignore ) ;
67
+ }
68
+ // eslint-disable-next-line react-hooks/exhaustive-deps
69
+ } , [ values . config . properties . http20Enabled , values . config . properties . minTlsVersion , values . site . properties . clientCertMode ] ) ;
70
+
98
71
return scenarioChecker . checkScenario ( ScenarioIds . incomingClientCertSupported , { site } ) . status !== 'disabled' ? (
99
72
< >
100
73
< h3 > { t ( 'incomingClientCertificates' ) } </ h3 >
101
74
< div className = { settingsWrapper } >
102
- < RadioButtonNoFormik
103
- dirty = { getCompositeClientCertMode ( values . site ) !== getCompositeClientCertMode ( initialValues . site ) }
75
+ { clientCertWarningMessage && (
76
+ < CustomBanner id = "clinet-cert-warning" message = { clientCertWarningMessage } type = { MessageBarType . warning } undocked = { true } />
77
+ ) }
78
+ < Field
79
+ name = { 'site.properties.clientCertMode' }
80
+ component = { RadioButton }
81
+ dirty = { values . site . properties . clientCertMode !== initialValues . site . properties . clientCertMode }
104
82
label = { t ( 'clientCertificateMode' ) }
105
83
id = "incoming-client-certificate-mode"
106
84
ariaLabelledBy = { `incoming-client-certificate-mode-label` }
107
- disabled = { disableAllControls || clientCertEnabled . status === 'disabled' || values . config . properties . http20Enabled }
85
+ disabled = { disableAllControls || clientCertEnabled . status === 'disabled' }
108
86
upsellMessage = { clientCertEnabled . status === 'disabled' ? clientCertEnabled . data : '' }
109
- selectedKey = { getCompositeClientCertMode ( values . site ) }
110
87
infoBubbleMessage = { getClientCertInfoBubbleMessage ( values . site ) }
111
88
options = { [
112
89
{
113
- key : CompositeClientCertMode . Require ,
114
- text : t ( 'clientCertificateModeRequire ' ) ,
90
+ key : ClientCertMode . Required ,
91
+ text : t ( 'clientCertificateModeRequired ' ) ,
115
92
} ,
116
93
{
117
- key : CompositeClientCertMode . Allow ,
118
- text : t ( 'clientCertificateModeAllow ' ) ,
94
+ key : ClientCertMode . Optional ,
95
+ text : t ( 'clientCertificateModeOptional ' ) ,
119
96
} ,
120
97
{
121
- key : CompositeClientCertMode . Optional ,
122
- text : t ( 'clientCertificateModeOptional' ) ,
98
+ key : ClientCertMode . OptionalInteractiveUser ,
99
+ text : t ( 'clientCertificateModeOptionalInteractiveUser' ) ,
100
+ disabled : disableOptionalInteractiveUserOption ,
123
101
} ,
124
102
{
125
- key : CompositeClientCertMode . Ignore ,
103
+ key : ClientCertMode . Ignore ,
126
104
text : t ( 'clientCertificateModeIgnore' ) ,
127
105
} ,
128
106
] }
129
- onChange = { onClientCertModeChange }
130
107
/>
131
108
< Stack horizontal >
132
109
< Field
@@ -150,7 +127,7 @@ const ClientCert: React.FC<FormikProps<AppSettingsFormValues>> = props => {
150
127
id = { `edit-client-cert-exclusion-paths` }
151
128
ariaLabel = { t ( 'editCertificateExlusionPaths' ) }
152
129
title = { t ( 'editCertificateExlusionPaths' ) }
153
- disabled = { disableAllControls || ! values . site . properties . clientCertEnabled }
130
+ disabled = { disableAllControls || values . site . properties . clientCertMode === ClientCertMode . Ignore }
154
131
onClick = { openClientExclusionPathPanel }
155
132
/>
156
133
</ Stack >
0 commit comments