2020
2121import jakarta .ws .rs .core .MediaType ;
2222import java .nio .charset .StandardCharsets ;
23+ import java .time .Duration ;
2324import java .util .ArrayList ;
2425import java .util .Base64 ;
2526import java .util .Comparator ;
9192import org .apache .wicket .model .Model ;
9293import org .apache .wicket .model .PropertyModel ;
9394import org .apache .wicket .model .util .ListModel ;
95+ import org .apache .wicket .validation .IValidatable ;
96+ import org .apache .wicket .validation .IValidator ;
97+ import org .apache .wicket .validation .ValidationError ;
9498import org .apache .wicket .validation .validator .UrlValidator ;
9599
96100public class ClientAppModalPanelBuilder <T extends ClientAppTO > extends AbstractModalPanelBuilder <T > {
97101
98102 private static final long serialVersionUID = 5945391813567245081L ;
99103
104+ protected static class DurationValidator implements IValidator <String > {
105+
106+ private static final long serialVersionUID = 3978328825079032964L ;
107+
108+ @ Override
109+ public void validate (final IValidatable <String > validatable ) {
110+ try {
111+ Duration .parse (validatable .getValue ());
112+ } catch (Exception e ) {
113+ validatable .error (new ValidationError (this ));
114+ }
115+ }
116+ }
117+
100118 protected final IModel <Map <String , String >> accessPolicies = new LoadableDetachableModel <>() {
101119
102120 private static final long serialVersionUID = -2012833443695917883L ;
@@ -522,44 +540,44 @@ public String getObject() {
522540 new PropertyModel <>(clientAppTO , "metadataSignatureLocation" ), false ));
523541
524542 AjaxDropDownChoicePanel <MetadataCriteriaDirection > metadataCriteriaDirection =
525- new AjaxDropDownChoicePanel <>(
526- "field" , "metadataCriteriaDirection" ,
527- new PropertyModel <>(clientAppTO , "metadataCriteriaDirection" ),
528- false );
543+ new AjaxDropDownChoicePanel <>(
544+ "field" , "metadataCriteriaDirection" ,
545+ new PropertyModel <>(clientAppTO , "metadataCriteriaDirection" ),
546+ false );
529547 metadataCriteriaDirection .setChoices (List .of (MetadataCriteriaDirection .values ()));
530548 fields .add (metadataCriteriaDirection );
531549
532550 fields .add (new AjaxTextFieldPanel (
533- "field" , "metadataCriteriaPattern" ,
534- new PropertyModel <>(clientAppTO , "metadataCriteriaPattern" ), false ));
551+ "field" , "metadataCriteriaPattern" ,
552+ new PropertyModel <>(clientAppTO , "metadataCriteriaPattern" ), false ));
535553
536554 fields .add (new AjaxTextFieldPanel (
537- "field" , "subjectLocality" ,
538- new PropertyModel <>(clientAppTO , "subjectLocality" ), false ));
555+ "field" , "subjectLocality" ,
556+ new PropertyModel <>(clientAppTO , "subjectLocality" ), false ));
539557
540558 AjaxDropDownChoicePanel <SigningCredentialType > signingCredentialType =
541- new AjaxDropDownChoicePanel <>(
542- "field" , "signingCredentialType" ,
543- new PropertyModel <>(clientAppTO , "signingCredentialType" ),
544- false );
559+ new AjaxDropDownChoicePanel <>(
560+ "field" , "signingCredentialType" ,
561+ new PropertyModel <>(clientAppTO , "signingCredentialType" ),
562+ false );
545563 signingCredentialType .setChoices (List .of (SigningCredentialType .values ()));
546564 fields .add (signingCredentialType );
547565
548566 AjaxDropDownChoicePanel <SAML2BindingType > logoutResponseBinding =
549- new AjaxDropDownChoicePanel <>(
550- "field" , "logoutResponseBinding" ,
551- new PropertyModel <>(clientAppTO , "logoutResponseBinding" ),
552- false );
567+ new AjaxDropDownChoicePanel <>(
568+ "field" , "logoutResponseBinding" ,
569+ new PropertyModel <>(clientAppTO , "logoutResponseBinding" ),
570+ false );
553571 logoutResponseBinding .setChoices (List .of (SAML2BindingType .values ()));
554572 fields .add (logoutResponseBinding );
555573
556574 fields .add (new AjaxCheckBoxPanel (
557- "field" , "logoutResponseEnabled" ,
558- new PropertyModel <>(clientAppTO , "logoutResponseEnabled" )));
575+ "field" , "logoutResponseEnabled" ,
576+ new PropertyModel <>(clientAppTO , "logoutResponseEnabled" )));
559577
560578 fields .add (new AjaxCheckBoxPanel (
561- "field" , "requireSignedRoot" ,
562- new PropertyModel <>(clientAppTO , "requireSignedRoot" )));
579+ "field" , "requireSignedRoot" ,
580+ new PropertyModel <>(clientAppTO , "requireSignedRoot" )));
563581
564582 fields .add (new AjaxCheckBoxPanel (
565583 "field" , "signAssertions" , new PropertyModel <>(clientAppTO , "signAssertions" )));
@@ -574,76 +592,76 @@ public String getObject() {
574592 "field" , "encryptAssertions" , new PropertyModel <>(clientAppTO , "encryptAssertions" )));
575593
576594 fields .add (new AjaxCheckBoxPanel (
577- "field" , "encryptAttributes" ,
578- new PropertyModel <>(clientAppTO , "encryptAttributes" )));
579-
595+ "field" , "encryptAttributes" ,
596+ new PropertyModel <>(clientAppTO , "encryptAttributes" )));
597+
580598 fields .add (new AjaxCheckBoxPanel (
581- "field" , "skipGeneratingAssertionNameId" ,
582- new PropertyModel <>(clientAppTO , "skipGeneratingAssertionNameId" )));
599+ "field" , "skipGeneratingAssertionNameId" ,
600+ new PropertyModel <>(clientAppTO , "skipGeneratingAssertionNameId" )));
583601
584602 fields .add (new AjaxCheckBoxPanel (
585- "field" , "skipGeneratingSubjectConfirmationInResponseTo" ,
586- new PropertyModel <>(clientAppTO , "skipGeneratingSubjectConfirmationInResponseTo" )));
603+ "field" , "skipGeneratingSubjectConfirmationInResponseTo" ,
604+ new PropertyModel <>(clientAppTO , "skipGeneratingSubjectConfirmationInResponseTo" )));
587605
588606 fields .add (new AjaxCheckBoxPanel (
589- "field" , "skipGeneratingResponseInResponseTo" ,
590- new PropertyModel <>(clientAppTO , "skipGeneratingResponseInResponseTo" )));
607+ "field" , "skipGeneratingResponseInResponseTo" ,
608+ new PropertyModel <>(clientAppTO , "skipGeneratingResponseInResponseTo" )));
591609
592610 fields .add (new AjaxCheckBoxPanel (
593- "field" , "skipGeneratingSubjectConfirmationNotOnOrAfter" ,
594- new PropertyModel <>(clientAppTO , "skipGeneratingSubjectConfirmationNotOnOrAfter" )));
611+ "field" , "skipGeneratingSubjectConfirmationNotOnOrAfter" ,
612+ new PropertyModel <>(clientAppTO , "skipGeneratingSubjectConfirmationNotOnOrAfter" )));
595613
596614 fields .add (new AjaxCheckBoxPanel (
597- "field" , "skipGeneratingSubjectConfirmationRecipient" ,
598- new PropertyModel <>(clientAppTO , "skipGeneratingSubjectConfirmationRecipient" )));
615+ "field" , "skipGeneratingSubjectConfirmationRecipient" ,
616+ new PropertyModel <>(clientAppTO , "skipGeneratingSubjectConfirmationRecipient" )));
599617
600618 fields .add (new AjaxCheckBoxPanel (
601- "field" , "skipGeneratingSubjectConfirmationRecipient" ,
602- new PropertyModel <>(clientAppTO , "skipGeneratingSubjectConfirmationRecipient" )));
619+ "field" , "skipGeneratingSubjectConfirmationRecipient" ,
620+ new PropertyModel <>(clientAppTO , "skipGeneratingSubjectConfirmationRecipient" )));
603621
604622 fields .add (new AjaxCheckBoxPanel (
605- "field" , "skipGeneratingSubjectConfirmationAddress" ,
606- new PropertyModel <>(clientAppTO , "skipGeneratingSubjectConfirmationAddress" )));
623+ "field" , "skipGeneratingSubjectConfirmationAddress" ,
624+ new PropertyModel <>(clientAppTO , "skipGeneratingSubjectConfirmationAddress" )));
607625
608626 fields .add (new AjaxCheckBoxPanel (
609- "field" , "skipGeneratingSubjectConfirmationNotBefore" ,
610- new PropertyModel <>(clientAppTO , "skipGeneratingSubjectConfirmationNotBefore" )));
627+ "field" , "skipGeneratingSubjectConfirmationNotBefore" ,
628+ new PropertyModel <>(clientAppTO , "skipGeneratingSubjectConfirmationNotBefore" )));
611629
612630 fields .add (new AjaxCheckBoxPanel (
613- "field" , "skipGeneratingSubjectConfirmationNameId" ,
614- new PropertyModel <>(clientAppTO , "skipGeneratingSubjectConfirmationNameId" )));
631+ "field" , "skipGeneratingSubjectConfirmationNameId" ,
632+ new PropertyModel <>(clientAppTO , "skipGeneratingSubjectConfirmationNameId" )));
615633
616634 fields .add (new AjaxCheckBoxPanel (
617- "field" , "skipGeneratingNameIdQualifiers" ,
618- new PropertyModel <>(clientAppTO , "skipGeneratingNameIdQualifiers" )));
635+ "field" , "skipGeneratingNameIdQualifiers" ,
636+ new PropertyModel <>(clientAppTO , "skipGeneratingNameIdQualifiers" )));
619637
620638 fields .add (new AjaxCheckBoxPanel (
621- "field" , "skipGeneratingTransientNameId" ,
622- new PropertyModel <>(clientAppTO , "skipGeneratingTransientNameId" )));
639+ "field" , "skipGeneratingTransientNameId" ,
640+ new PropertyModel <>(clientAppTO , "skipGeneratingTransientNameId" )));
623641
624642 fields .add (new AjaxCheckBoxPanel (
625- "field" , "skipValidatingAuthnRequest" ,
626- new PropertyModel <>(clientAppTO , "skipValidatingAuthnRequest" )));
643+ "field" , "skipValidatingAuthnRequest" ,
644+ new PropertyModel <>(clientAppTO , "skipValidatingAuthnRequest" )));
627645
628646 fields .add (new AjaxCheckBoxPanel (
629- "field" , "skipGeneratingServiceProviderNameIdQualifier" ,
630- new PropertyModel <>(clientAppTO , "skipGeneratingServiceProviderNameIdQualifier" )));
647+ "field" , "skipGeneratingServiceProviderNameIdQualifier" ,
648+ new PropertyModel <>(clientAppTO , "skipGeneratingServiceProviderNameIdQualifier" )));
631649
632650 fields .add (new AjaxCheckBoxPanel (
633- "field" , "skipGeneratingAuthenticatingAuthority" ,
634- new PropertyModel <>(clientAppTO , "skipGeneratingAuthenticatingAuthority" )));
651+ "field" , "skipGeneratingAuthenticatingAuthority" ,
652+ new PropertyModel <>(clientAppTO , "skipGeneratingAuthenticatingAuthority" )));
635653
636654 fields .add (new AjaxCheckBoxPanel (
637- "field" , "skipGeneratingNameIdQualifier" ,
638- new PropertyModel <>(clientAppTO , "skipGeneratingNameIdQualifier" )));
655+ "field" , "skipGeneratingNameIdQualifier" ,
656+ new PropertyModel <>(clientAppTO , "skipGeneratingNameIdQualifier" )));
639657
640658 fields .add (new AjaxCheckBoxPanel (
641- "field" , "skipGeneratingSessionNotOnOrAfter" ,
642- new PropertyModel <>(clientAppTO , "skipGeneratingSessionNotOnOrAfter" )));
659+ "field" , "skipGeneratingSessionNotOnOrAfter" ,
660+ new PropertyModel <>(clientAppTO , "skipGeneratingSessionNotOnOrAfter" )));
643661
644662 fields .add (new AjaxCheckBoxPanel (
645- "field" , "validateMetadataCertificates" ,
646- new PropertyModel <>(clientAppTO , "validateMetadataCertificates" )));
663+ "field" , "validateMetadataCertificates" ,
664+ new PropertyModel <>(clientAppTO , "validateMetadataCertificates" )));
647665
648666 fields .add (new AjaxTextFieldPanel (
649667 "field" , "requiredAuthenticationContextClass" ,
@@ -656,9 +674,15 @@ public String getObject() {
656674 requiredNameIdFormat .addRequiredLabel ().setEnabled (true );
657675 fields .add (requiredNameIdFormat );
658676
659- fields .add (new AjaxNumberFieldPanel .Builder <Integer >().min (0 ).build (
660- "field" , "skewAllowance" , Integer .class ,
661- new PropertyModel <>(clientAppTO , "skewAllowance" )));
677+ AjaxTextFieldPanel skewAllowance = new AjaxTextFieldPanel (
678+ "field" , "skewAllowance" , new PropertyModel <>(clientAppTO , "skewAllowance" ), false );
679+ skewAllowance .addValidator (new DurationValidator ());
680+ fields .add (skewAllowance );
681+
682+ AjaxTextFieldPanel validityUntil = new AjaxTextFieldPanel (
683+ "field" , "validityUntil" , new PropertyModel <>(clientAppTO , "validityUntil" ), false );
684+ validityUntil .addValidator (new DurationValidator ());
685+ fields .add (validityUntil );
662686
663687 fields .add (new AjaxTextFieldPanel (
664688 "field" , "nameIdQualifier" , new PropertyModel <>(clientAppTO , "nameIdQualifier" ), false ));
0 commit comments