5
5
6
6
package pl .edu .icm .unity .oauth .as .console ;
7
7
8
+ import static io .imunity .vaadin .elements .CSSVars .TEXT_FIELD_BIG ;
9
+ import static io .imunity .vaadin .elements .CSSVars .TEXT_FIELD_MEDIUM ;
10
+ import static io .imunity .vaadin .elements .CssClassNames .IDP_INFO_LAYOUT ;
11
+ import static io .imunity .vaadin .elements .CssClassNames .MEDIUM_VAADIN_FORM_ITEM_LABEL ;
12
+
13
+ import java .nio .charset .StandardCharsets ;
14
+ import java .security .PrivateKey ;
15
+ import java .security .interfaces .ECPrivateKey ;
16
+ import java .security .interfaces .RSAPrivateKey ;
17
+ import java .util .Collection ;
18
+ import java .util .HashSet ;
19
+ import java .util .List ;
20
+ import java .util .Optional ;
21
+ import java .util .Set ;
22
+ import java .util .function .Consumer ;
23
+ import java .util .stream .Collectors ;
24
+
8
25
import com .google .common .base .Strings ;
9
26
import com .google .common .collect .ImmutableSet ;
10
27
import com .nimbusds .jose .JWSAlgorithm ;
31
48
import com .vaadin .flow .data .binder .Binder ;
32
49
import com .vaadin .flow .data .binder .ValidationResult ;
33
50
import com .vaadin .flow .data .validator .IntegerRangeValidator ;
51
+
34
52
import eu .unicore .util .httpclient .ServerHostnameCheckingMode ;
35
53
import io .imunity .console .utils .tprofile .OutputTranslationProfileFieldFactory ;
36
- import io .imunity .vaadin .elements .*;
37
- import io .imunity .vaadin .elements .grid .GridWithEditorInDetails ;
38
- import io .imunity .vaadin .endpoint .common .api .HtmlTooltipFactory ;
39
- import io .imunity .vaadin .endpoint .common .api .SubViewSwitcher ;
40
54
import io .imunity .vaadin .auth .services .DefaultServiceDefinition ;
41
55
import io .imunity .vaadin .auth .services .ServiceEditorBase ;
42
56
import io .imunity .vaadin .auth .services .ServiceEditorComponent ;
57
+ import io .imunity .vaadin .elements .CustomValuesMultiSelectComboBox ;
58
+ import io .imunity .vaadin .elements .EnumComboBox ;
59
+ import io .imunity .vaadin .elements .LocalizedTextFieldDetails ;
60
+ import io .imunity .vaadin .elements .NoSpaceValidator ;
61
+ import io .imunity .vaadin .elements .grid .GridWithEditorInDetails ;
62
+ import io .imunity .vaadin .endpoint .common .api .HtmlTooltipFactory ;
63
+ import io .imunity .vaadin .endpoint .common .api .SubViewSwitcher ;
64
+ import io .imunity .vaadin .endpoint .common .exceptions .FormValidationException ;
65
+ import pl .edu .icm .unity .base .exceptions .EngineException ;
43
66
import pl .edu .icm .unity .base .exceptions .WrongArgumentException ;
44
67
import pl .edu .icm .unity .base .i18n .I18nString ;
45
68
import pl .edu .icm .unity .base .identity .IdentityType ;
46
69
import pl .edu .icm .unity .base .message .MessageSource ;
70
+ import pl .edu .icm .unity .engine .api .PKIManagement ;
47
71
import pl .edu .icm .unity .engine .api .endpoint .EndpointPathValidator ;
48
72
import pl .edu .icm .unity .oauth .as .OAuthASProperties .AccessTokenFormat ;
49
73
import pl .edu .icm .unity .oauth .as .OAuthASProperties .RefreshTokenIssuePolicy ;
52
76
import pl .edu .icm .unity .oauth .as .OAuthSystemScopeProvider ;
53
77
import pl .edu .icm .unity .oauth .as .token .OAuthTokenEndpoint ;
54
78
import pl .edu .icm .unity .oauth .as .webauthz .OAuthAuthzWebEndpoint ;
55
- import io .imunity .vaadin .endpoint .common .exceptions .FormValidationException ;
56
-
57
- import java .nio .charset .StandardCharsets ;
58
- import java .util .*;
59
- import java .util .function .Consumer ;
60
- import java .util .stream .Collectors ;
61
-
62
- import static io .imunity .vaadin .elements .CSSVars .TEXT_FIELD_BIG ;
63
- import static io .imunity .vaadin .elements .CSSVars .TEXT_FIELD_MEDIUM ;
64
- import static io .imunity .vaadin .elements .CssClassNames .IDP_INFO_LAYOUT ;
65
- import static io .imunity .vaadin .elements .CssClassNames .MEDIUM_VAADIN_FORM_ITEM_LABEL ;
66
79
67
80
/**
68
81
* OAuth service editor general tab
72
85
*/
73
86
class OAuthEditorGeneralTab extends VerticalLayout implements ServiceEditorBase .EditorTab
74
87
{
75
- private MessageSource msg ;
88
+ private final MessageSource msg ;
89
+ private final PKIManagement pkiManagement ;
76
90
private Binder <DefaultServiceDefinition > oauthWebAuthzBinder ;
77
91
private Binder <DefaultServiceDefinition > oauthTokenBinder ;
78
92
private Binder <OAuthServiceConfiguration > configBinder ;
@@ -98,13 +112,14 @@ class OAuthEditorGeneralTab extends VerticalLayout implements ServiceEditorBase.
98
112
private Set <String > validators ;
99
113
private final HtmlTooltipFactory htmlTooltipFactory ;
100
114
101
- OAuthEditorGeneralTab (MessageSource msg , HtmlTooltipFactory htmlTooltipFactory , String serverPrefix , Set <String > serverContextPaths ,
115
+ OAuthEditorGeneralTab (MessageSource msg , PKIManagement pkiManagement , HtmlTooltipFactory htmlTooltipFactory , String serverPrefix , Set <String > serverContextPaths ,
102
116
SubViewSwitcher subViewSwitcher , OutputTranslationProfileFieldFactory profileFieldFactory , boolean editMode ,
103
117
Set <String > credentials , Collection <IdentityType > identityTypes , List <String > attrTypes ,
104
118
List <String > usedEndpointsPaths , List <OAuthScope > systemScopes , Set <String > validators , Set <String > certificates )
105
119
{
106
120
this .msg = msg ;
107
-
121
+ this .pkiManagement = pkiManagement ;
122
+
108
123
this .editMode = editMode ;
109
124
this .credentials = credentials ;
110
125
this .idTypes = identityTypes ;
@@ -406,17 +421,7 @@ private Component buildHeaderSection()
406
421
credential .setItems (credentials );
407
422
configBinder .forField (credential )
408
423
.asRequired ((v , c ) ->
409
- {
410
- if (credential .isEnabled () && (v == null || v .isEmpty ())
411
- && !Family .HMAC_SHA .contains (JWSAlgorithm .parse (signingAlg .getValue ()
412
- .toString ())))
413
- {
414
- return ValidationResult .error (msg .getMessage ("fieldRequired" ));
415
- }
416
-
417
- return ValidationResult .ok ();
418
-
419
- })
424
+ validateCredential (v , credential .isEnabled (), signingAlg .getValue () != null ? signingAlg .getValue ().toString () : null ))
420
425
.bind ("credential" );
421
426
422
427
credential .setEnabled (false );
@@ -461,6 +466,51 @@ private Component buildHeaderSection()
461
466
return main ;
462
467
}
463
468
469
+ private PrivateKey getPrivateKey (String cred ) throws EngineException
470
+ {
471
+ return pkiManagement .getCredential (cred ).getKey ();
472
+ }
473
+
474
+ private ValidationResult validateCredential (String credential , boolean isEnabled , String signingAlg )
475
+ {
476
+ if (signingAlg == null )
477
+ {
478
+ return ValidationResult .ok ();
479
+ }
480
+
481
+ if (isEnabled && (credential == null || credential .isEmpty ())
482
+ && !Family .HMAC_SHA .contains (JWSAlgorithm .parse (signingAlg )))
483
+ {
484
+ return ValidationResult .error (msg .getMessage ("fieldRequired" ));
485
+ }
486
+
487
+ PrivateKey pk ;
488
+ try
489
+ {
490
+ pk = getPrivateKey (credential );
491
+ } catch (EngineException e1 )
492
+ {
493
+ return ValidationResult .error (msg .getMessage ("OAuthEditorGeneralTab.credentialError" ));
494
+ }
495
+ if (pk == null )
496
+ {
497
+ return ValidationResult .error (msg .getMessage ("OAuthEditorGeneralTab.credentialError" ));
498
+ }
499
+
500
+ if (!(pk instanceof RSAPrivateKey ) && Family .RSA .contains (JWSAlgorithm .parse (signingAlg )))
501
+ {
502
+ return ValidationResult .error (msg .getMessage ("OAuthEditorGeneralTab.privateKeyError" , "RSA" , "RS" ));
503
+ }
504
+
505
+ if (!(pk instanceof ECPrivateKey ) && Family .EC .contains (JWSAlgorithm .parse (signingAlg )))
506
+ {
507
+ return ValidationResult .error (msg .getMessage ("OAuthEditorGeneralTab.privateKeyError" , "EC" , "ES" ));
508
+ }
509
+
510
+
511
+ return ValidationResult .ok ();
512
+ }
513
+
464
514
private void refreshScope (boolean add , OIDCScopeValue value )
465
515
{
466
516
Optional <OAuthScopeBean > scope = configBinder .getBean ()
@@ -626,6 +676,8 @@ private void refreshSigningControls()
626
676
credential .setEnabled (false );
627
677
signingAlg .setEnabled (false );
628
678
}
679
+
680
+ configBinder .getBinding ("credential" ).get ().validate ();
629
681
630
682
}
631
683
0 commit comments