package Ġno . nav . g and alf . api . controllers Ċ Ċ import Ġio . prometheus . client . Histogram Ċ import Ġio . swagger . v 3 . o as . annotations . Operation Ċ import Ġno . nav . g and alf . ac ces sto ken . AccessToken Issuer Ċ import Ġno . nav . g and alf . api . W ST rust Request Ċ import Ġno . nav . g and alf . ldap . Custom Authentication Provider Ċ import Ġno . nav . g and alf . ldap . authenticate Ċ import Ġno . nav . g and alf . metric . Application Metric Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġorg . springframework . http . HttpStatus Ċ import Ġorg . springframework . http . Response Entity Ċ import Ġorg . springframework . web . bind . annotation . PostMapping Ċ import Ġorg . springframework . web . bind . annotation . RequestBody Ċ import Ġorg . springframework . web . bind . annotation . RequestMapping Ċ import Ġorg . springframework . web . bind . annotation . RestController Ċ Ċ @ RestController Ċ @ RequestMapping (" rest / v 1 / sts ", Ġconsume s Ġ= Ġ[" text / xml "], Ġproduces Ġ= Ġ[" text / xml "]) Ċ class ĠW SS AML Token Controller ( ĊĠĠĠ Ġ@ Autowired Ġval Ġprovider : ĠCustom Authentication Provider , ĊĠĠĠ Ġ@ Autowired Ġval Ġissuer : ĠAccess Token Issuer Ċ ) Ġ{ ĊĊĠĠĠ Ġ@ Operation ( hidden Ġ= Ġtrue ) ĊĠĠĠ Ġ@ PostMapping ("/ ws / saml token ") ĊĠĠĠ Ġfun Ġget SAML Token WS ( ĊĠĠĠĠĠĠĠ Ġ@ RequestBody Ġxml Request : ĠString ? ĊĠĠĠ Ġ): ĠResponseEntity < Any > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequest Timer : ĠHistogram . Timer Ġ= ĠApplication Metric . request Latency W SS AML Token . start Timer () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( xml Request Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Metric . ws SAML Token Not Ok . inc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity . status ( HttpStatus . BAD _ REQUEST ). body (" Error : ĠBody Ġis Ġempty ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġparse Ġxml ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġws Req Ġ= ĠW ST rust Request () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Req . read ( xml Request !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Metric . ws SAML Token Not Ok . inc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity . status ( HttpStatus . BAD _ REQUEST ). body (" Error : Ġ${ e . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġcheck Ġauthorization ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠBind Ġto Ġldap ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider . authenticate ( ws Req . username , Ġws Req . password ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Metric . ws SAML Token Not Ok . inc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity . status ( HttpStatus . UN AUTHORIZ ED ). body (" Unauthorized Ġuser : Ġ${ e . message }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Req . is Validate S aml Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" is Validate S aml ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs aml Token : ĠString ? Ġ= Ġws Req . validate Target ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissuer . validate S aml Token ( saml Token ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Metric . ws SAML Token Ok . inc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity . status ( HttpStatus . OK ). body ( ws Req . getResponse ( saml Token !! )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Metric . ws SAML Token Not Ok . inc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity . status ( HttpStatus . BAD _ REQUEST ). body (" Validation Ġfailed " Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Req . is Issue S aml From UNT Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" is Issue S aml From UNT ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs aml Token : ĠString Ġ= Ġissuer . issue S aml Token ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Req . username !! , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Req . username , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAccess Token Issuer . DEFAULT _ SAML _ AUTH LEVEL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Metric . ws SAML Token Ok . inc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity . status ( HttpStatus . OK ). body ( ws Req . getResponse ( saml Token )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Metric . ws SAML Token Not Ok . inc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity . status ( HttpStatus . INTERNAL _ SERVER _ ERROR ). body (" Error : Ġ${ e . message }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġws Req . is Exchange Oid c ToS aml Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" is Exchange Oid c ToS aml ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs aml Token : ĠString Ġ= Ġissuer . exchange Oid c ToS aml Token ( ws Req . decoded Oid c Token !! , Ġws Req . username ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Metric . ws SAML Token Ok . inc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity . status ( HttpStatus . OK ). body ( ws Req . getResponse ( saml Token )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Metric . ws Exchange OID C Token Not Ok . inc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠResponseEntity . status ( HttpStatus . BAD _ REQUEST ). body (" Error : Ġ" Ġ+ Ġe . message ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication Metric . ws SAML Token Not Ok . inc () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠResponseEntity . status ( HttpStatus . BAD _ REQUEST ). body (" Request Ġis Ġunsupported ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest Timer . observe Duration () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ