package Ġde . z al ando . z ally . rule . z al ando Ċ Ċ import Ġcom . types afe . config . Config Ċ import Ġde . z al ando . z ally . rule . api . Check Ċ import Ġde . z al ando . z ally . rule . api . Context Ċ import Ġde . z al ando . z ally . rule . api . Rule Ċ import Ġde . z al ando . z ally . rule . api . Severity Ċ import Ġde . z al ando . z ally . rule . api . Violation Ċ import Ġio . swagger . v 3 . o as . models . Open API Ċ import Ġio . swagger . v 3 . o as . models . Path Item Ċ import Ġio . swagger . v 3 . o as . models . security . Security Scheme Ċ import Ġorg . springframework . beans . factory . annotation . Autowired Ċ import Ġjava . util . Sorted Set Ċ Ċ @ Rule ( ĊĠĠĠ Ġrule Set Ġ= ĠZ al ando Rule Set :: class , ĊĠĠĠ Ġid Ġ= Ġ" 1 0 5 ", ĊĠĠĠ Ġseverity Ġ= ĠSeverity . MUST , ĊĠĠĠ Ġtitle Ġ= Ġ" Secure ĠAll ĠEnd points ĠWith ĠS copes " Ċ ) Ċ class ĠSecure All Endpoints With Scopes Rule (@ Autowired Ġrules Config : ĠConfig ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġscope Regex Ġ= ĠRegex ( ĊĠĠĠĠĠĠĠ Ġrules Config . getString ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ Secure All Endpoints With Scopes Rule :: class . java . simple Name }. scope _ regex " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġval Ġpath Whitelist Ġ= Ġrules Config . getString List ( ĊĠĠĠĠĠĠĠ Ġ"${ Secure All Endpoints With Scopes Rule :: class . java . simple Name }. path _ whitelist " ĊĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . to Regex () Ġ} ĊĊĠĠĠ Ġ@ Check ( severity Ġ= ĠSeverity . MUST ) ĊĠĠĠ Ġfun Ġcheck Defined Scope Formats ( context : ĠContext ): ĠList < Violation > Ġ= ĊĠĠĠĠĠĠĠ Ġcontext . api . components ?. security Schemes ?. values . or Empty () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . type Ġ== ĠSecurity Scheme . Type . O AUTH 2 Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġit . all Flows () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġflow Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflow . scopes . or Empty (). keys . filter Not Ġ{ Ġscope Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġscope Regex . matches ( scope ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġscope Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . violation (" scope Ġ'$ scope ' Ġdoes Ġnot Ġmatch Ġregex Ġ'$ scope Regex '", Ġflow . scopes ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Check ( severity Ġ= ĠSeverity . MUST ) ĊĠĠĠ Ġfun Ġcheck Operations Are Scoped ( context : ĠContext ): ĠList < Violation > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdefined Ġ= Ġdefined ( context . api ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcontext . validate Operations ( path Filter Ġ= Ġthis :: path Filter ) Ġ{ Ġ(_, Ġop ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequested Ġ= Ġrequested ( context . api , Ġop , Ġdefined ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġundefined Ġ= Ġundefined ( requested , Ġdefined ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrequested . isEmpty () Ġ-> Ġcontext . vi olations (" Endpoint Ġnot Ġsec ured Ġby ĠOAuth 2 Ġscope ( s )", Ġop ?. security Ġ?: Ġop ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġundefined . isNotEmpty () Ġ-> Ġcontext . vi olations ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Endpoint Ġsec ured Ġby Ġundefined ĠOAuth 2 Ġscope ( s ): Ġ${ undefined . join ToString () }", Ġop ?. security ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġop ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġpath Filter ( entry : ĠMap . Entry < String , ĠPath Item ?> ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġpath Whitelist . none Ġ{ Ġit . contains Match In ( entry . key ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠSecurity Scheme ?. all Flows () Ġ= ĠlistOf NotNull ( ĊĠĠĠĠĠĠĠ Ġthis ?. flows ?. implicit , ĊĠĠĠĠĠĠĠ Ġthis ?. flows ?. password , ĊĠĠĠĠĠĠĠ Ġthis ?. flows ?. client Credentials , ĊĠĠĠĠĠĠĠ Ġthis ?. flows ?. authorization Code ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġdefined ( api : ĠOpenAPI ): ĠMap < String , ĠSet < String >> Ġ= Ġapi . components ?. security Schemes . or Empty () ĊĠĠĠĠĠĠĠ Ġ. filter Values Ġ{ Ġscheme Ġ-> Ġscheme . type Ġ== ĠSecurity Scheme . Type . O AUTH 2 Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Values Ġ{ Ġit . value . all Flows (). flatMap Ġ{ Ġit . scopes . keys Ġ}. toSet () Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġrequested ( ĊĠĠĠĠĠĠĠ Ġapi : ĠOpenAPI , ĊĠĠĠĠĠĠĠ Ġop : Ġio . swagger . v 3 . o as . models . Operation ?, ĊĠĠĠĠĠĠĠ Ġdefined : ĠMap < String , ĠSet < String >> ĊĠĠĠ Ġ): ĠList < Pair < String , ĠString >> Ġ= Ġ( op ?. security Ġ?: Ġapi . security Ġ?: Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġrequirement Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequirement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Keys Ġ{ Ġname Ġ-> Ġdefined . containsKey ( name ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġ( name , Ġscopes ) Ġ-> Ġscopes . map Ġ{ Ġname Ġto Ġit Ġ} Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġundefined ( ĊĠĠĠĠĠĠĠ Ġrequested : ĠList < Pair < String , ĠString >>, ĊĠĠĠĠĠĠĠ Ġdefined : ĠMap < String , ĠSet < String >> ĊĠĠĠ Ġ): ĠSorted Set < String > Ġ= Ġrequested ĊĠĠĠĠĠĠĠ Ġ. filter Not Ġ{ Ġ( name , Ġscope ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefined [ name ]. or Empty (). contains ( scope ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġ"${ it . first }:${ it . second }" Ġ} ĊĠĠĠĠĠĠĠ Ġ. to Sorted Set () Ċ } Ċ