/** Ċ Ġ* ĠCopyright Ġ 2 0 1 0 Ġ- Ġ 2 0 2 1 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġjet brains . ex od us . crypto Ċ Ċ import Ġjet brains . ex od us . core . data Structures . hash . Long HashMap Ċ import Ġjet brains . ex od us . core . data Structures . hash . Long Set Ċ import Ġjet brains . ex od us . entity store . Blob Vault Ċ import Ġjet brains . ex od us . entity store . Blob Vault Item Ċ import Ġjet brains . ex od us . entity store . Disk Based Blob Vault Ċ import Ġjet brains . ex od us . entity store . FileSystem Blob Vault Old Ċ import Ġjet brains . ex od us . env . Transaction Ċ import Ġjava . io . File Ċ import Ġjava . io . FileInputStream Ċ import Ġjava . io . InputStream Ċ import Ġjava . io . OutputStream Ċ Ċ class ĠEn crypted Blob Vault ( private Ġval Ġdecor ated : ĠFileSystem Blob Vault Old , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcipher Provider : ĠStream Cipher Provider , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcipher Key : ĠByteArray , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprivate Ġval Ġcipher Basic IV : ĠLong ) Ġ: ĠBlob Vault ( decor ated ), ĠDisk Based Blob Vault Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġget Source Vault () Ġ= Ġdecor ated ĊĊĠĠĠ Ġoverride Ġfun Ġclear () Ġ= Ġdecor ated . clear () ĊĊĠĠĠ Ġoverride Ġfun Ġget Backup Strategy () Ġ= Ġdecor ated . backup Strategy ĊĊĠĠĠ Ġoverride Ġfun Ġget Blob ( blob Handle : ĠLong ): ĠBlob Vault Item Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdecor ated . get Blob ( blob Handle ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠgetContent ( blob Handle : ĠLong , Ġtxn : ĠTransaction ): ĠInputStream ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdecor ated . getContent ( blob Handle , Ġtxn )?. run Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStream Cipher InputStream ( this ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Cipher ( blob Handle ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdelete ( blob Handle : ĠLong ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdecor ated . delete ( blob Handle ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Blob Location ( blob Handle : ĠLong ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdecor ated . get Blob Location ( blob Handle ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Blob Location ( blob Handle : ĠLong , Ġreadonly : ĠBoolean ): ĠFile Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdecor ated . get Blob Location ( blob Handle , Ġreadonly ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Blob Key ( blob Handle : ĠLong ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġdecor ated . get Blob Key ( blob Handle ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Size ( blob Handle : ĠLong , Ġtxn : ĠTransaction ) Ġ= Ġdecor ated . getSize ( blob Handle , Ġtxn ) ĊĊĠĠĠ Ġoverride Ġfun Ġrequires Txn () Ġ= Ġdecor ated . requires Txn () ĊĊĠĠĠ Ġoverride Ġfun Ġflush Blob s ( blob Streams : ĠLong HashMap < InputStream > ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblob Files : ĠLong HashMap < File > ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdeferred Blob sTo Delete : ĠLong Set ?, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtxn : ĠTransaction ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstreams Ġ= ĠLong HashMap < InputStream >() ĊĠĠĠĠĠĠĠ Ġblob Streams ?. forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstreams [ it . key ] Ġ= ĠStream Cipher InputStream ( it . value ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Cipher ( it . key ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġopen Files : ĠMutable List < InputStream >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( blob Files Ġ!= Ġnull Ġ&& Ġblob Files . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġopen Files Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġblob Files . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstreams [ it . key ] Ġ= ĠStream Cipher InputStream ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFileInputStream ( it . value ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġopen Files . add ( it ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Buffered ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. apply Ġ{ Ġmark ( Int . MAX _ VALUE ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnew Cipher ( it . key ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdecor ated . flush Blob s ( streams , Ġnull , Ġdeferred Blob sTo Delete , Ġtxn ) ĊĠĠĠĠĠĠĠ Ġ} Ġfinally Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġopen Files ?. forEach Ġ{ Ġit . close () Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġsize () Ġ= Ġdecor ated . size () ĊĊĠĠĠ Ġoverride Ġfun Ġnext Handle ( txn : ĠTransaction ) Ġ= Ġdecor ated . next Handle ( txn ) ĊĊĠĠĠ Ġoverride Ġfun Ġclose () Ġ= Ġdecor ated . close () ĊĊĠĠĠ Ġfun Ġwrap OutputStream ( blob Handle : ĠLong , Ġoutput : ĠOutputStream ): ĠStream Cipher OutputStream Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠStream Cipher OutputStream ( output , Ġnew Cipher ( blob Handle )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġnew Cipher ( blob Handle : ĠLong ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcipher Provider . new Cipher (). apply Ġ{ Ġinit ( cipher Key , Ġ( cipher Basic IV Ġ- Ġblob Handle ). as Has hed IV ()) Ġ} Ċ } Ċ