package Ġcom . github . le om ill on . jwt . generator Ċ Ċ import Ġcom . fasterxml . jackson . module . kotlin . jackson ObjectMapper Ċ import Ġcom . fasterxml . jackson . module . kotlin . readValue Ċ import Ġcom . xen om ach ina . arg parser . Arg Parser Ċ import Ġcom . xen om ach ina . arg parser . InvalidArgumentException Ċ import Ġcom . xen om ach ina . arg parser . default Ċ import Ġcom . xen om ach ina . common . orElse Ċ import Ġio . json web token . Compression Codec Ċ import Ġio . json web token . Compression Code cs Ċ import Ġio . json web token . Jw ts Ċ import Ġio . json web token . Signature Algorithm Ċ import Ġjava . io . File Ċ import Ġjava . time . Duration Ċ import Ġjava . time . Instant Ċ import Ġjava . util . Date Ċ Ċ fun Ġexec Generate ( args : ĠArray < String >) Ġ= Ġwrap Command Body ( command Name Ġ= ĠCommand . CREATE . code ) Ġ{ ĊĊĠĠĠ Ġval Ġtoken Params Ġ= Ġto Token Params ( args ) ĊĊĠĠĠ Ġval Ġtoken Ġ= Ġcreate Token ( token Params ) ĊĊĠĠĠ Ġif Ġ( log . is Info Enabled ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġparsed Jwt Ġ= Ġread Token ( token , Ġignore Signature Ġ= Ġtrue , Ġignore Expiration Ġ= Ġtrue ) ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Header Ġ Ġ: Ġ${ parsed Jwt . header }" Ġ} ĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ Ġ" Body ĠĠĠ Ġ: Ġ${ parsed Jwt . body }" Ġ} ĊĊĠĠĠĠĠĠĠ Ġlog . info Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Generated Ġtoken Ġuntil Ġ: Ġ${ token Params . claims . expiration ?. to Instant () Ġ?: Ġ" no Ġexpiration Ġdate "} " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġdisplay And Exit ( token , Ġ 0 ) Ċ } Ċ Ċ fun Ġto Token Params ( args : ĠArray < String >) Ġ= ĠArg Parser ( args ). parse Into (:: Create Cmd Args ). to Token Params () Ċ Ċ class ĠCreate Cmd Args ( parser : ĠArg Parser ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġclaims File Ġby Ġparser . st oring ("- f ", Ġ"-- claims - file ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" JSON Ġclaims Ġfile Ġpath ") Ġ{ ĊĠĠĠĠĠĠĠ ĠFile ( this ) ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. default < File ? >( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Validator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . exists ()) Ġthrow ĠInvalidArgumentException (" Unable Ġto Ġfind Ġfile Ġat Ġpath Ġ${ it . path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġclaims Ġby Ġparser . option < Mutable Map < String , ĠString >> ("- c ", Ġ"-- claim ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarg Names Ġ= ĠlistOf (" NAME ", Ġ" VALUE "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" claim Ġto Ġadd Ġto Ġjwt Ġbody Ġ( override Ġclaims Ġfrom Ġfile )") Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue . orElse Ġ{ Ġmutable Map Of < String , ĠString >() Ġ}. apply Ġ{ Ġput ( arguments [ 0 ], Ġarguments [ 1 ]) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. default ( mutable Map Of < String , ĠString >()) ĊĊĠĠĠ Ġprivate Ġval Ġheaders File Ġby Ġparser . st oring ("-- headers - file ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" JSON Ġheaders Ġfile Ġpath ") Ġ{ ĊĠĠĠĠĠĠĠ ĠFile ( this ) ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. default < File ? >( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Validator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . exists ()) Ġthrow ĠInvalidArgumentException (" Unable Ġto Ġfind Ġfile Ġat Ġpath Ġ${ it . path }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġheaders Ġby Ġparser . option < Mutable Map < String , ĠString >> ("-- header ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarg Names Ġ= ĠlistOf (" NAME ", Ġ" VALUE "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" header Ġto Ġadd Ġto Ġjwt Ġheader Ġ( override Ġheaders Ġfrom Ġfile )") Ġ{ ĊĠĠĠĠĠĠĠ Ġvalue . orElse Ġ{ Ġmutable Map Of < String , ĠString >() Ġ}. apply Ġ{ Ġput ( arguments [ 0 ], Ġarguments [ 1 ]) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. default ( mutable Map Of < String , ĠString >()) ĊĊĠĠĠ Ġprivate Ġval Ġduration Ġby Ġparser . st oring ("- d ", Ġ"-- duration ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġset Ġthe Ġduration Ġof Ġthe Ġtoken Ġ( expiration Ġdate Ġ= Ġnow Ġ+ Ġduration ). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFormat Ġ: ĠPT n Hn Mn . n S Ġ( ex : ĠPT 1 0 H Ġ= Ġ 1 0 Ġhours ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ()) Ġ{ ĊĠĠĠĠĠĠĠ ĠDuration . parse ( this ) ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. default < Duration ? >( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Validator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( it . is Negative ) Ġthrow ĠIllegalArgumentException (" Duration Ġmust Ġbe Ġpositive ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcompression Codec Ġby Ġparser . mapping ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- def late " Ġto ĠCompression Code cs . DE FL ATE , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ"-- gzip " Ġto ĠCompression Code cs . GZIP , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ" the Ġcompression Ġcodec Ġto Ġuse ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. default < Compression Codec ? >( null ) ĊĊĠĠĠ Ġprivate Ġval Ġhmac Signature Ġby Ġparser . option < Pair < Signature Algorithm , ĠString > ?> ("-- hmac - sign ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarg Names Ġ= ĠlistOf (" HMAC _ ALG ", Ġ" SECRET "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠHMAC Ġsignature Ġalgorithm Ġand Ġbase 6 4 Ġencoded Ġsecret Ġkey . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAvailable Ġalgorithms Ġ: Ġ${ Signature Algorithm . values (). filter Ġ{ Ġit . is H mac Ġ}. toList ()} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ()) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvalue . orElse Ġ{ ĠPair ( Signature Algorithm . forName ( arguments [ 0 ]), Ġarguments [ 1 ]) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. default < Pair < Signature Algorithm , ĠString >? >( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Validator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ Ġif Ġ(! it . first . is H mac ) Ġthrow ĠInvalidArgumentException (" Invalid ĠHMAC Ġalgorithm ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġrsa Signature Ġby Ġparser . option < Pair < Signature Algorithm , ĠFile > ?> ("-- rsa - sign ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġarg Names Ġ= ĠlistOf (" RSA _ ALG ", Ġ" FILE _ PATH "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠRSA Ġsignature Ġalgorithm Ġand ĠPrivate ĠKey Ġ( PEM ) Ġfile Ġpath . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠAvailable Ġalgorithms Ġ: Ġ${ Signature Algorithm . values (). filter Ġ{ Ġit . is R sa Ġ}. toList ()} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ()) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġvalue . orElse Ġ{ ĠPair ( Signature Algorithm . forName ( arguments [ 0 ]), ĠFile ( arguments [ 1 ])) Ġ} ĊĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. default < Pair < Signature Algorithm , ĠFile >? >( null ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Validator Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . first . is R sa ) Ġthrow ĠInvalidArgumentException (" Invalid ĠRSA Ġalgorithm ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! it . second . exists ()) Ġthrow ĠInvalidArgumentException (" Unable Ġto Ġfind Ġfile Ġat Ġpath Ġ${ it . second }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġpem File Password Ġby Ġparser . st oring ("- p ", Ġ"-- password ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġhelp Ġ= Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthe Ġpassword Ġof Ġthe Ġencrypted ĠPEM Ġfile . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠWill Ġbe Ġasked Ġinter activ ely Ġif Ġnot Ġprovided Ġvia Ġthis Ġparameter . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. default < String ? >( null ) ĊĊĠĠĠ Ġfun Ġto Token Params (): ĠToken Params Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġnow Ġ= ĠInstant . now () ĊĊĠĠĠĠĠĠĠ Ġval Ġtoken Claims Ġ= ĠJ w ts . claims () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. set Iss ued At ( Date . from ( now )) ĊĊĠĠĠĠĠĠĠ Ġduration ?. let Ġ{ Ġtoken Claims . set Expiration ( Date . from ( now . plus ( it ))) Ġ} ĊĊĠĠĠĠĠĠĠ Ġclaims File ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Claims . put All ( jackson ObjectMapper (). readValue < Map < String , ĠAny >>( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( e ) Ġ{ Ġ" Unable Ġto Ġparse Ġclaims Ġfile Ġ: Ġ${ e . message }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalidArgumentException (" Unable Ġto Ġparse Ġclaims Ġfile ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtoken Claims . put All ( claims ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtoken Headers Ġ= Ġmutable Map Of < String , ĠAny >() ĊĊĠĠĠĠĠĠĠ Ġheaders File ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtoken Headers . put All ( jackson ObjectMapper (). readValue < Map < String , ĠAny >>( it )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . debug ( e ) Ġ{ Ġ" Unable Ġto Ġparse Ġheaders Ġfile Ġ: Ġ${ e . message }" Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalidArgumentException (" Unable Ġto Ġparse Ġheaders Ġfile ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtoken Headers . put All ( headers ) ĊĊĠĠĠĠĠĠĠ Ġval Ġpassword Provider Ġ= Ġpem File Password ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . let Ġ{ Ġ{ Ġit . toCharArray () Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprint (" Enter Ġpassword Ġ${ rsa Signature ?. second ?. path ?. let Ġ{ Ġ" ($ it ) Ġ" Ġ}} : Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠApplication . ask Password () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠToken Params ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclaims Ġ= Ġtoken Claims , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġheaders Ġ= ĠJ w ts . header ( token Headers ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhmac Alg And Secret Ġ= Ġhmac Signature , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrsa Alg And File Ġ= Ġrsa Signature , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcompression Codec Ġ= Ġcompression Codec , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpassword Provider Ġ= Ġpassword Provider ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ