package Ġcom . mong ok rypt . shared . vault . configuration Ċ Ċ import Ġcom . fasterxml . jackson . core . Json Parser Ċ import Ġcom . fasterxml . jackson . core . Json Processing Exception Ċ import Ġcom . fasterxml . jackson . core . type . Type Reference Ċ import Ġcom . fasterxml . jackson . databind . Deserialization Context Ċ import Ġcom . fasterxml . jackson . databind . JsonNode Ċ import Ġcom . fasterxml . jackson . databind . de ser . std . Std Deserializer Ċ import Ġcom . mong ok rypt . shared . configuration . Mongo K rypt Configuration Ċ import Ġcom . mong ok rypt . shared . vault . configuration . exception . Missing Configuration Field Exception Ċ import Ġcom . mong ok rypt . shared . vault . configuration . gcp . Google Cloud Provider Configuration Ċ import Ġcom . mong ok rypt . shared . vault . configuration . local . Local Provider Configuration Ċ import Ġcom . mong ok rypt . shared . vault . provider . Abstract Key Provider Ċ import Ġcom . mong ok rypt . shared . vault . provider . Google Cloud Provider Ċ import Ġcom . mong ok rypt . shared . vault . provider . Local Provider Ċ import Ġcom . mong ok rypt . shared . utilities . Jack son Utils . mapper Ċ import Ġjava . io . IOException Ċ import Ġkotlin . reflect . K Class Ċ Ċ /** Ċ Ġ* Ġ@ author ĠJ acob ĠR h iel Ġ< jacob . rh iel @ gmail . com > Ċ Ġ* Ġ@ created ĠJul Ġ 1 5 , Ġ 2 0 2 1 Ċ Ġ*/ Ċ class ĠMongo K rypt Configuration Deserializer Ġ: ĊĠĠĠ ĠStd Deserializer < Mongo K rypt Configuration >( Mongo K rypt Configuration :: class . java ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġprovider Types Ġ= ĠarrayOf (" local ", Ġ" gcp ", Ġ" aws ", Ġ" azure ") ĊĊĠĠĠ Ġ@ Throws ( IOException :: class , ĠJson Processing Exception :: class ) ĊĠĠĠ Ġoverride Ġfun Ġdeserialize ( parser : ĠJson Parser , Ġctx : ĠDeserial ization Context ): ĠMongo K rypt Configuration Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnode : ĠJsonNode Ġ= Ġparser . codec . read Tree ( parser ) ĊĠĠĠĠĠĠĠ Ġval Ġhas Vault Ġ= Ġnode . has (" vault ") ĊĠĠĠĠĠĠĠ Ġif Ġ(! has Vault ) Ġthrow ĠMissing Configuration Field Exception (" vault ") ĊĠĠĠĠĠĠĠ Ġval Ġvault Settings Ġ= Ġnode . get (" vault ") ĊĠĠĠĠĠĠĠ Ġval Ġvault Configuration Ġ= Ġmapper . convert Value ( vault Settings , ĠKey Vault Configuration :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġhas Providers Ġ= Ġnode . has (" providers ") ĊĠĠĠĠĠĠĠ Ġval Ġprovider Configuration Ġ= Ġif Ġ( has Providers ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproviders Ġ= Ġnode . get (" providers ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdefine Provider Configuration ( vault Configuration , Ġproviders ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġnull ĊĠĠĠĠĠĠĠ Ġreturn ĠMongo K rypt Configuration ( vault Configuration , Ġprovider Configuration Ġ?: Ġempty Map ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdefine Provider Configuration ( ĊĠĠĠĠĠĠĠ Ġvault Configuration : ĠKey Vault Configuration , ĊĠĠĠĠĠĠĠ Ġprovider Node : ĠJsonNode ĊĠĠĠ Ġ): ĠMutable Map < K Class < out ĠI Provider Configuration >, ĠAbstract Key Provider < out ĠI Provider Configuration >> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġprovider Fields Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapper . convert Value ( provider Node , Ġobject Ġ: ĠType Reference < Map < String , ĠAny >>() Ġ{}). to Mutable Map () ĊĠĠĠĠĠĠĠ Ġval Ġprovider Configuration Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmutable Map Of < K Class < out ĠI Provider Configuration >, ĠAbstract Key Provider < out ĠI Provider Configuration >>() ĊĠĠĠĠĠĠĠ Ġif Ġ( provider Fields . keys . any Ġ{ Ġit Ġin Ġprovider Types Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprovider Fields . keys . toSet (). forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( it ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" gcp " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġg cp Node Ġ= Ġprovider Fields [" gcp "] Ġas ? ĠMap < *, Ġ*> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Required Map Fields ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġg cp Node , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠlistOf (" email ", Ġ" privateKey ", Ġ" projectId ", Ġ" key Ring ", Ġ" key Name ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= ĠconvertTo Configuration < Google Cloud Provider Configuration >( gcp Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider Configuration [ Google Cloud Provider Configuration :: class ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠGoogle Cloud Provider ( vault Configuration . uri , Ġvault Configuration . namespace , Ġconfiguration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" local " Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlocal Node Ġ= Ġprovider Fields [" local "] Ġas ? ĠMap < *, Ġ*> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Required Map Fields ( local Node , ĠlistOf (" master Key ")) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġconfiguration Ġ= ĠconvertTo Configuration < Local Provider Configuration >( local Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider Configuration [ Local Provider Configuration :: class ] Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLocal Provider ( vault Configuration . uri , Ġvault Configuration . namespace , Ġconfiguration ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprovider Fields . remove ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( provider Fields . keys . isNotEmpty () Ġ&& Ġ! provider Fields . keys . any Ġ{ Ġit Ġin Ġprovider Types Ġ}) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprintln (" Unknown Ġprovider Ġtypes : Ġ${ provider Fields . keys . to Typed Array (). content Deep ToString ()}. ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġprovider Configuration ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Required Node Fields ( node : ĠJsonNode , Ġrequired Field Names : ĠList < String >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmissing Fields Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġrequired Field Names . forEach Ġ{ ĠfieldName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! node . has NonNull ( fieldName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmissing Fields . add ( fieldName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( missing Fields . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Missing Ġfield Ġnames : Ġ$ missing Fields ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Required Map Fields ( map : ĠMap < *, Ġ*> ?, Ġrequired Field Names : ĠList < String >): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( map . isNull OrEmpty ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġmissing Fields Ġ= Ġmutable ListOf < String >() ĊĠĠĠĠĠĠĠ Ġrequired Field Names . forEach Ġ{ ĠfieldName Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! map . containsKey ( fieldName )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmissing Fields . add ( fieldName ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( missing Fields . isNotEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠException (" Missing Ġfield Ġnames : Ġ$ missing Fields ") ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠI Provider Configuration > ĠconvertTo Configuration ( ĊĠĠĠĠĠĠĠ Ġdata : ĠAny ? ĊĠĠĠ Ġ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmapper . convert Value ( data , ĠT :: class . java ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . printStackTrace () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġe . message Ġ?: Ġ"" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpre Ġ= Ġmessage . substring After (" JSON Ġproperty ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfieldName Ġ= Ġpre . substring Before (" due Ġto Ġmissing "). trim () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠMissing Configuration Field Exception ( fieldName , ĠT :: class :: simple Name . name ) ĊĠĠĠĠĠĠĠ Ġ} Ġas ĠT ĊĠĠĠ Ġ} Ċ Ċ }