package Ġnet . cord a . dj vm . tools . cli Ċ Ċ import Ġnet . cord a . dj vm . Sandbox Configuration Ċ import Ġnet . cord a . dj vm . analysis . Analysis Configuration Ċ import Ġnet . cord a . dj vm . analysis . Whitelist Ċ import Ġnet . cord a . dj vm . execution .* Ċ import Ġnet . cord a . dj vm . references . Class Module Ċ import Ġnet . cord a . dj vm . source . Class Source Ċ import Ġnet . cord a . dj vm . source . Source ClassLoader Ċ import Ġnet . cord a . dj vm . utilities . Discovery Ċ import Ġd jvm . org . object web . asm . Class Reader Ċ import Ġpic oc li . CommandLine . Option Ċ import Ġjava . nio . file . Files Ċ import Ġjava . nio . file . Path Ċ import Ġjava . nio . file . Paths Ċ Ċ @ Suppress (" K Doc Missing Documentation ", Ġ" Member Visibility Can Be Private ") Ċ abstract Ġclass ĠClass Command Ġ: ĠCommand Base () Ġ{ ĊĊĠĠĠ Ġ@ Option ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnames Ġ= Ġ[" - p ", Ġ"-- profile "], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ[" The Ġexecution Ġprofile Ġto Ġuse Ġ( DEFAULT , ĠUN LIMIT ED , ĠDISABLE _ BRANCH ING Ġor ĠDISABLE _ TH ROWS ). "] ĊĠĠĠ Ġ) ĊĠĠĠ Ġvar Ġprofile : ĠExecution Profile Ġ= ĠExecution Profile . DEFAULT ĊĊĠĠĠ Ġ@ Option ( names Ġ= Ġ[" -- ignore - rules "], Ġdescription Ġ= Ġ[" Disable Ġall Ġrules Ġpert aining Ġto Ġthe Ġsandbox ." ]) ĊĠĠĠ Ġvar Ġignore Rules : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ@ Option ( names Ġ= Ġ[" -- ignore - emitter s "], Ġdescription Ġ= Ġ[" Disable Ġall Ġemitter s Ġdefined Ġfor Ġthe Ġsandbox ." ]) ĊĠĠĠ Ġvar Ġignore Emit ters : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ@ Option ( names Ġ= Ġ[" -- ignore - definition - providers "], Ġdescription Ġ= Ġ[" Disable Ġall Ġdefinition Ġproviders ." ]) ĊĠĠĠ Ġvar Ġignore Definition Providers : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ@ Option ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnames Ġ= Ġ[" - w ", Ġ"-- whitelist "], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ[" Override Ġthe Ġdefault Ġwhitelist . ĠUse Ġprovided Ġwhitelist Ġinstead . ĠIf ĠNONE Ġis Ġprovided , Ġthe Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" whitelist Ġwill Ġbe Ġignored . ĠIf ĠALL Ġis Ġprovided , Ġall Ġreferences Ġwill Ġbe Ġwh itelisted . ĠLANG Ġcan Ġbe Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" used Ġto Ġonly Ġwhitelist Ġselect Ġclasses Ġand Ġtheir Ġmembers Ġfrom Ġthe Ġjava . lang Ġpackage ."] ĊĠĠĠ Ġ) ĊĠĠĠ Ġvar Ġwhitelist : ĠPath ? Ġ= Ġnull ĊĊĠĠĠ Ġ@ Option ( names Ġ= Ġ[" - c ", Ġ"-- classpath "], Ġdescription Ġ= Ġ[" Add itions Ġto Ġthe Ġdefault Ġclass Ġpath ." ], Ġsplit Ġ= Ġ": ") ĊĠĠĠ Ġvar Ġclass Path : ĠArray < Path > Ġ= Ġempty Array () ĊĊĠĠĠ Ġ@ Option ( names Ġ= Ġ[" -- disable - tracing "], Ġdescription Ġ= Ġ[" Disable Ġtracing Ġin Ġthe Ġsandbox ." ]) ĊĠĠĠ Ġvar Ġdisable Tracing : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ@ Option ( names Ġ= Ġ[" -- analyze - annotations "], Ġdescription Ġ= Ġ[" Analyze Ġall Ġannotations Ġeven Ġif Ġthey Ġare Ġnot Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" explicit ly Ġreferenced ." ]) ĊĠĠĠ Ġvar Ġanalyze Annotations : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ@ Option ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnames Ġ= Ġ[" -- prefix - filters "], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdescription Ġ= Ġ[" Only Ġrecord Ġmessages Ġmatching Ġone Ġof Ġthe Ġprovided Ġprefixes ." ], ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsplit Ġ= Ġ":" ĊĠĠĠ Ġ) ĊĠĠĠ Ġvar Ġprefix Filters : ĠArray < String > Ġ= Ġempty Array () ĊĊĠĠĠ Ġabstract Ġval Ġfilters : ĠArray < String > ĊĊĠĠĠ Ġprivate Ġval Ġclass Module Ġ= ĠClass Module () ĊĊĠĠĠ Ġprivate Ġlateinit Ġvar Ġclass Loader : ĠClassLoader ĊĊĠĠĠ Ġprotected Ġvar Ġexecutor Ġ= ĠSandbox Executor < Any , ĠAny >( Sandbox Configuration . DEFAULT ) ĊĊĠĠĠ Ġprivate Ġvar Ġderived Whitelist : ĠWh itelist Ġ= ĠWh itelist . MIN IMAL ĊĊĠĠĠ Ġabstract Ġfun Ġprocess Classes ( classes : ĠList < Class <* >>) ĊĊĠĠĠ Ġopen Ġfun Ġprint Success ( classes : ĠList < Class <* >>) Ġ{} ĊĊĠĠĠ Ġoverride Ġfun Ġvalidate Arguments () Ġ= Ġfilters . isNotEmpty () ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Command (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġderived Whitelist Ġ= Ġwhitelist From Path ( whitelist ) ĊĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= Ġget Configuration ( derived Whitelist ) ĊĠĠĠĠĠĠĠ Ġclass Loader Ġ= ĠSource ClassLoader ( getClass path (), Ġconfiguration . analysis Configuration . class Resolver ) ĊĠĠĠĠĠĠĠ Ġcreate Executor ( configuration ) ĊĊĠĠĠĠĠĠĠ Ġval Ġclasses Ġ= Ġdiscover Classes ( filters ). on Empty Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Could Ġnot Ġfind Ġany Ġclasses Ġmatching Ġ${ filters . join ToString (" Ġ" )} Ġon Ġthe Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" system Ġclass Ġpath ") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Classes ( classes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Success ( classes ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Exception ( exception ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( exception Ġis ĠSandbox Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint Cost s ( exception . execution Summary . costs ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġfun Ġprint Cost s ( costs : ĠCost Summary ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( disable Tracing ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġprint Info (" Runtime ĠCost ĠSummary :") ĊĠĠĠĠĠĠĠ Ġprint Info (" Ġ- Ġallocations Ġ= Ġ@ | yellow Ġ${ costs . alloc ations } |@ ") ĊĠĠĠĠĠĠĠ Ġprint Info (" Ġ- Ġinv ocations Ġ= Ġ@ | yellow Ġ${ costs . inv ocations } |@ ") ĊĠĠĠĠĠĠĠ Ġprint Info (" Ġ- Ġjumps Ġ= Ġ@ | yellow Ġ${ costs . jump s } |@ ") ĊĠĠĠĠĠĠĠ Ġprint Info (" Ġ- Ġthrows Ġ= Ġ@ | yellow Ġ${ costs . throws } |@ ") ĊĠĠĠĠĠĠĠ Ġprint Info () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdiscover Classes ( filters : ĠArray < String >): ĠList < Class <* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfind Discover able Run n ables ( filters ) Ġ+ Ġfind Referenced Classes ( filters ) Ġ+ Ġfind Classes In J ars ( filters ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Discover able Run n ables ( filters : ĠArray < String >): ĠList < Class <* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclasses Ġ= Ġfind < java . util . function . Function < *, * >>() ĊĠĠĠĠĠĠĠ Ġval Ġapplicable Filters Ġ= Ġfilters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġ! is Jar File ( it ) Ġ&& Ġ! is Full ClassName ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġfiltered Classes Ġ= Ġapplicable Filters ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġfilter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclasses . filter Ġ{ Ġclazz Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclazz . name . contains ( filter , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( applic able Filters . isNotEmpty () Ġ&& Ġfiltered Classes . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Could Ġnot Ġfind Ġany Ġclasses Ġimplementing Ġ${ java . util . function . Function :: class . java . simple Name } Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" wh ose Ġname Ġmatches Ġ'${ applic able Filters . join ToString (" Ġ" )} '") ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( applic able Filters . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Verbose (" Class Ġpath : Ġ$ user Class Path ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Verbose (" Dis covered Ġrun n ables Ġon Ġthe Ġclass Ġpath :") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( clazz Ġin Ġclasses ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint Verbose (" Ġ- Ġ${ clazz . name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Verbose () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġfiltered Classes ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Referenced Classes ( filters : ĠArray < String >): ĠList < Class <* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfilters . filter Ġ{ Ġ! is Jar File ( it ) Ġ&& Ġis Full ClassName ( it ) Ġ}. map Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġclass Module . get Formatted ClassName ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprint Verbose (" Looking Ġup Ġclass Ġ$ className ...") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlook Up Class ( className ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġfind Classes In J ars ( filters : ĠArray < String >): ĠList < Class <* >> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġfilters . filter Ġ{ Ġis Jar File ( it ) Ġ}. flatMap Ġ{ Ġjar File Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable ListOf < Class <* >> (). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠClass Source . from Path ( Paths . get ( jar File )). get Stream Iterator (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreader Ġ= ĠClass Reader ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠclassName Ġ= Ġclass Module . get Formatted ClassName ( reader . className ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint Verbose (" Looking Ġup Ġclass Ġ$ className Ġin Ġ$ jar File ...") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add ( look Up Class ( className )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlook Up Class ( className : ĠString ): ĠClass < *> Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Loader . load Class ( className ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠNo Class Def Found Error ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreference Ġ= Ġexception . message ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" referenced Ġclass Ġ${ class Module . get Formatted ClassName ( it )} Ġin Ġ" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Unable Ġto Ġload Ġ${ reference } type Ġ$ className Ġ( is Ġit Ġpresent Ġon Ġthe Ġclass Ġpath ?) ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠType Not Present Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreference Ġ= Ġexception . typeName () Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Type Ġ$ reference Ġnot Ġpresent Ġin Ġclass Ġ$ className ") ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( exception : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Unable Ġto Ġload Ġtype Ġ$ className Ġ( is Ġit Ġpresent Ġon Ġthe Ġclass Ġpath ?) ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġis Jar File ( filter : ĠString ) Ġ= ĠFiles . exists ( Paths . get ( filter )) Ġ&& Ġfilter . endsWith (". jar ", Ġtrue ) ĊĊĠĠĠ Ġprivate Ġfun Ġis Full ClassName ( filter : ĠString ) Ġ= Ġfilter . count Ġ{ Ġit Ġ== Ġ'.' Ġ} Ġ> Ġ 0 ĊĊĠĠĠ Ġprivate Ġfun ĠgetClass path () Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclass Path . toList () Ġ+ Ġfilters . filter Ġ{ Ġit . endsWith (". jar ", Ġtrue ) Ġ}. map Ġ{ ĠPaths . get ( it ) Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Configuration ( whitelist : ĠWh itelist ): ĠSandbox Configuration Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠSandbox Configuration . of ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprofile Ġ= Ġprofile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrules Ġ= Ġif Ġ( ignore Rules ) Ġ{ Ġempty List () Ġ} Ġelse Ġ{ ĠDiscovery . find () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġemitter s Ġ= Ġignore Emit ters . emptyList If True Other wise Null (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdefinition Providers Ġ= Ġif Ġ( ignore Definition Providers ) Ġ{ Ġempty List () Ġ} Ġelse Ġ{ ĠDiscovery . find () Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġenable Tracing Ġ= Ġ! disable Tracing , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalysis Configuration Ġ= ĠAnalysis Configuration . create Root ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhitelist Ġ= Ġwhitelist , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġminimum Severity Level Ġ= Ġlevel , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġanalyze Annotations Ġ= Ġanalyze Annotations , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprefix Filters Ġ= Ġprefix Filters . toList (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsource ClassLoader Factory Ġ= Ġ{ Ġclass Resolver , Ġbootstrap ClassLoader Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSource ClassLoader ( getClass path (), Ġclass Resolver , Ġbootstrap ClassLoader ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcreate Executor ( configuration : ĠSandbox Configuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġexecutor Ġ= ĠSandbox Executor ( configuration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġ< T > ĠBoolean . emptyList If True Other wise Null (): ĠList < T >? Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue Ġ-> Ġempty List () ĊĠĠĠĠĠĠĠ Ġfalse Ġ-> Ġnull ĊĠĠĠ Ġ} Ċ Ċ }