Skip to content

Commit 25acf4c

Browse files
Merge pull request #548 from RedisInsight/feature/RI-2727-SNI_UI
#RI-2727 - UI for SNI
2 parents 8f32a59 + 032aafa commit 25acf4c

File tree

3 files changed

+138
-14
lines changed

3 files changed

+138
-14
lines changed

redisinsight/ui/src/pages/home/components/AddInstanceForm/InstanceForm/InstanceForm.spec.tsx

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -232,6 +232,74 @@ describe('InstanceForm', () => {
232232
)
233233
})
234234

235+
it('should change "Use SNI" with prepopulated with host', async () => {
236+
const handleSubmit = jest.fn()
237+
render(
238+
<div id="footerDatabaseForm">
239+
<InstanceForm
240+
{...instance(mockedProps)}
241+
isEditMode
242+
formFields={{
243+
...formFields,
244+
tls: {},
245+
connectionType: ConnectionType.Cluster,
246+
}}
247+
onSubmit={handleSubmit}
248+
/>
249+
</div>
250+
)
251+
fireEvent.click(screen.getByTestId('sni'))
252+
253+
const submitBtn = screen.getByTestId(BTN_SUBMIT)
254+
await waitFor(() => {
255+
fireEvent.click(submitBtn)
256+
})
257+
258+
expect(handleSubmit).toBeCalledWith(
259+
expect.objectContaining({
260+
sni: true,
261+
servername: formFields.host
262+
})
263+
)
264+
})
265+
266+
it('should change "Use SNI"', async () => {
267+
const handleSubmit = jest.fn()
268+
render(
269+
<div id="footerDatabaseForm">
270+
<InstanceForm
271+
{...instance(mockedProps)}
272+
isEditMode
273+
formFields={{
274+
...formFields,
275+
tls: {},
276+
connectionType: ConnectionType.Cluster,
277+
}}
278+
onSubmit={handleSubmit}
279+
/>
280+
</div>
281+
)
282+
fireEvent.click(screen.getByTestId('sni'))
283+
284+
await waitFor(() => {
285+
fireEvent.change(screen.getByTestId('sni-servername'), {
286+
target: { value: '12' },
287+
})
288+
})
289+
290+
const submitBtn = screen.getByTestId(BTN_SUBMIT)
291+
await waitFor(() => {
292+
fireEvent.click(submitBtn)
293+
})
294+
295+
expect(handleSubmit).toBeCalledWith(
296+
expect.objectContaining({
297+
sni: true,
298+
servername: '12'
299+
})
300+
)
301+
})
302+
235303
it('should change "Verify TLS Certificate"', async () => {
236304
const handleSubmit = jest.fn()
237305
render(

redisinsight/ui/src/pages/home/components/AddInstanceForm/InstanceForm/InstanceForm.tsx

Lines changed: 63 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ export interface DbConnectionInfo extends Instance {
7878
newTlsCertPairName?: string;
7979
newTlsClientCert?: string;
8080
newTlsClientKey?: string;
81+
servername?: string;
8182
verifyServerTlsCert?: boolean;
8283
caCertificates?: { name: string; id: string }[];
8384
selectedCaCertName: string | typeof ADD_NEW_CA_CERT | typeof NO_CA_CERT;
@@ -86,6 +87,7 @@ export interface DbConnectionInfo extends Instance {
8687
username?: string;
8788
password?: string;
8889
showDb?: boolean;
90+
sni?: boolean;
8991
sentinelMasterUsername?: string;
9092
sentinelMasterPassword?: string;
9193
}
@@ -129,6 +131,7 @@ const fieldDisplayNames: DbConnectionInfo = {
129131
newTlsCertPairName: 'Client Certificate Name',
130132
newTlsClientCert: 'Client Certificate',
131133
newTlsClientKey: 'Private Key',
134+
servername: 'Server Name',
132135
}
133136

134137
const getInitFieldsDisplayNames = ({ host, port, name, instanceType }: any) => {
@@ -165,7 +168,8 @@ const AddStandaloneForm = (props: Props) => {
165168
modules,
166169
sentinelMasterPassword,
167170
sentinelMasterUsername,
168-
isRediStack
171+
isRediStack,
172+
servername,
169173
},
170174
initialValues: initialValuesProp,
171175
width,
@@ -191,6 +195,7 @@ const AddStandaloneForm = (props: Props) => {
191195
db,
192196
modules,
193197
showDb: !!db,
198+
sni: !!servername,
194199
newCaCert: '',
195200
newCaCertName: '',
196201
selectedCaCertName,
@@ -263,6 +268,14 @@ const AddStandaloneForm = (props: Props) => {
263268
errs.newCaCert = fieldDisplayNames.newCaCert
264269
}
265270

271+
if (
272+
values.tls
273+
&& values.sni
274+
&& values.servername === ''
275+
) {
276+
errs.servername = fieldDisplayNames.servername
277+
}
278+
266279
if (
267280
values.tls
268281
&& values.tlsClientAuthRequired
@@ -593,6 +606,7 @@ const AddStandaloneForm = (props: Props) => {
593606
<EuiFlexItem className={flexItemClassName}>
594607
<EuiFormRow label="Host*">
595608
<EuiFieldText
609+
autoFocus
596610
name="host"
597611
id="host"
598612
data-testid="host"
@@ -726,7 +740,8 @@ const AddStandaloneForm = (props: Props) => {
726740
<EuiCallOut>
727741
<EuiText size="s" data-testid="db-index-message">
728742
When the database is added, you can select logical databases only in CLI.
729-
To work with other logical databases in Browser and Workbench, add another database with the same host and port,
743+
To work with other logical databases in Browser and Workbench,
744+
add another database with the same host and port,
730745
but a different database index.
731746
</EuiText>
732747
</EuiCallOut>
@@ -786,16 +801,52 @@ const AddStandaloneForm = (props: Props) => {
786801
</EuiFlexItem>
787802

788803
{formik.values.tls && (
789-
<EuiFlexItem className={flexItemClassName}>
790-
<EuiCheckbox
791-
id={`${htmlIdGenerator()()} verifyServerTlsCert`}
792-
name="verifyServerTlsCert"
793-
label="Verify TLS Certificate"
794-
checked={!!formik.values.verifyServerTlsCert}
795-
onChange={formik.handleChange}
796-
data-testid="verify-tls-cert"
797-
/>
798-
</EuiFlexItem>
804+
<>
805+
<EuiFlexItem className={flexItemClassName}>
806+
<EuiCheckbox
807+
id={`${htmlIdGenerator()()} sni`}
808+
name="sni"
809+
label="Use SNI"
810+
checked={!!formik.values.sni}
811+
onChange={(e: ChangeEvent<HTMLInputElement>) => {
812+
formik.setFieldValue(
813+
'servername',
814+
formik.values.servername ?? formik.values.host ?? ''
815+
)
816+
return formik.handleChange(e)
817+
}}
818+
data-testid="sni"
819+
/>
820+
</EuiFlexItem>
821+
{formik.values.sni && (
822+
<EuiFlexItem className={flexItemClassName}>
823+
<EuiFieldText
824+
name="servername"
825+
id="servername"
826+
fullWidth
827+
maxLength={200}
828+
placeholder="Enter Server Name"
829+
value={formik.values.servername ?? ''}
830+
onChange={(e: ChangeEvent<HTMLInputElement>) =>
831+
formik.setFieldValue(
832+
e.target.name,
833+
validateField(e.target.value.trim())
834+
)}
835+
data-testid="sni-servername"
836+
/>
837+
</EuiFlexItem>
838+
)}
839+
<EuiFlexItem className={flexItemClassName}>
840+
<EuiCheckbox
841+
id={`${htmlIdGenerator()()} verifyServerTlsCert`}
842+
name="verifyServerTlsCert"
843+
label="Verify TLS Certificate"
844+
checked={!!formik.values.verifyServerTlsCert}
845+
onChange={formik.handleChange}
846+
data-testid="verify-tls-cert"
847+
/>
848+
</EuiFlexItem>
849+
</>
799850
)}
800851
</EuiFlexGroup>
801852
{formik.values.tls && (

redisinsight/ui/src/pages/home/components/AddInstanceForm/InstanceFormWrapper.tsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@ const InstanceFormWrapper = (props: Props) => {
221221

222222
const {
223223
useTls,
224+
servername,
224225
verifyServerCert,
225226
caCert,
226227
clientAuth,
@@ -229,7 +230,7 @@ const InstanceFormWrapper = (props: Props) => {
229230

230231
if (useTls) {
231232
db.tls = {}
232-
233+
db.tls.servername = servername
233234
db.tls.verifyServerCert = !!verifyServerCert
234235

235236
if (typeof caCert?.new !== 'undefined') {
@@ -280,6 +281,7 @@ const InstanceFormWrapper = (props: Props) => {
280281

281282
const {
282283
useTls,
284+
servername,
283285
verifyServerCert,
284286
caCert,
285287
clientAuth,
@@ -288,7 +290,7 @@ const InstanceFormWrapper = (props: Props) => {
288290

289291
if (useTls) {
290292
database.tls = {}
291-
293+
database.tls.servername = servername
292294
database.tls.verifyServerCert = !!verifyServerCert
293295
if (typeof caCert?.new !== 'undefined') {
294296
database.tls.newCaCert = {
@@ -331,6 +333,8 @@ const InstanceFormWrapper = (props: Props) => {
331333
const {
332334
newCaCert,
333335
tls,
336+
sni,
337+
servername,
334338
newCaCertName,
335339
selectedCaCertName,
336340
tlsClientAuthRequired,
@@ -343,6 +347,7 @@ const InstanceFormWrapper = (props: Props) => {
343347

344348
const tlsSettings = {
345349
useTls: tls,
350+
servername: (sni && servername) || undefined,
346351
verifyServerCert: verifyServerTlsCert,
347352
caCert:
348353
!tls || selectedCaCertName === NO_CA_CERT

0 commit comments

Comments
 (0)