/* Ċ Ġ* ĠCopyright Ġ 2 0 0 0 - 2 0 1 6 Ġ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 Ġcom . intellij . credential Store Ċ Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . util . text . StringUtil Ċ import Ġcom . intellij . util . Encryption Support Ċ import Ġcom . intellij . util . generate Aes Key Ċ import Ġcom . intellij . util . io . toByteArray Ċ import Ġjava . nio . Char Buffer Ċ import Ġjava . security . Message Digest Ċ import Ġjava . util .* Ċ import Ġjavax . crypto . spec . SecretKey Spec Ċ Ċ internal Ġval ĠLOG Ġ= ĠLogger . getInstance ( Credential Store :: class . java ) Ċ Ċ private Ġfun Ġto Old Key ( hash : ĠByteArray ) Ġ= Ġ" old - hashed - key |" Ġ+ ĠBase 6 4 . get Encoder (). encode ToString ( hash ) Ċ Ċ internal Ġfun Ġto Old Key As Identity ( hash : ĠByteArray ) Ġ= ĠCredential Attributes ( SERVICE _ NAME _ PREFIX , Ġto Old Key ( hash )) Ċ Ċ fun Ġto Old Key ( request or : ĠClass <* >, ĠuserName : ĠString ): ĠCredential Attributes Ġ{ ĊĠ Ġreturn ĠCredential Attributes ( SERVICE _ NAME _ PREFIX , Ġto Old Key ( Message Digest . getInstance (" SHA - 2 5 6 "). digest ("${ request or . name }/ $ userName ". toByteArray ()))) Ċ } Ċ Ċ fun Ġjoin Data ( user : ĠString ?, Ġpassword : ĠOne Time String ?): ĠByteArray ? Ġ{ ĊĠ Ġif Ġ( user Ġ== Ġnull Ġ&& Ġpassword Ġ== Ġnull ) Ġ{ ĊĠĠĠ Ġreturn Ġnull ĊĠ Ġ} ĊĊĠ Ġval Ġbuilder Ġ= ĠStringBuilder ( user . or Empty ()) ĊĠ ĠString Util . escape Char ( builder , Ġ'\\ ') ĊĠ ĠString Util . escape Char ( builder , Ġ'@ ') ĊĠ Ġif Ġ( password Ġ!= Ġnull ) Ġ{ ĊĠĠĠ Ġbuilder . append ('@ ') ĊĠĠĠ Ġpassword . appendTo ( builder ) ĊĠ Ġ} ĊĊĠ Ġval Ġbuffer Ġ= ĠChar sets . UTF _ 8 . encode ( Char Buffer . wrap ( builder )) ĊĠ Ġ// Ġclear Ġpassword ĊĠ Ġbuilder . set Length ( 0 ) ĊĠ Ġreturn Ġbuffer . toByteArray () Ċ } Ċ Ċ fun Ġsplit Data ( data : ĠString ?): ĠCredentials ? Ġ{ ĊĠ Ġif Ġ( data . isNull OrEmpty ()) Ġ{ ĊĠĠĠ Ġreturn Ġnull ĊĠ Ġ} ĊĊĠ Ġval Ġlist Ġ= Ġparse String ( data !! , Ġ'@ ') ĊĠ Ġreturn ĠCredentials ( list . get OrNull ( 0 ), Ġlist . get OrNull ( 1 )) Ċ } Ċ Ċ private Ġconst Ġval ĠESC AP ING _ CHAR Ġ= Ġ'\\ ' Ċ Ċ private Ġfun Ġparse String ( data : ĠString , Ġdelimiter : ĠChar ): ĠList < String > Ġ{ ĊĠ Ġval Ġpart Ġ= ĠStringBuilder () ĊĠ Ġval Ġresult Ġ= ĠArrayList < String >( 2 ) ĊĠ Ġvar Ġi Ġ= Ġ 0 ĊĠ Ġvar Ġc : ĠChar ? ĊĠ Ġdo Ġ{ ĊĠĠĠ Ġc Ġ= Ġdata . get OrNull ( i ++) ĊĠĠĠ Ġif Ġ( c Ġ!= Ġnull Ġ&& Ġc Ġ!= Ġdelimiter ) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( c Ġ== ĠESC AP ING _ CHAR ) Ġ{ ĊĠĠĠĠĠĠĠ Ġc Ġ= Ġdata . get OrNull ( i ++) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġif Ġ( c Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġpart . append ( c ) ĊĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġresult . add ( part . toString ()) ĊĠĠĠ Ġpart . set Length ( 0 ) ĊĊĠĠĠ Ġif Ġ( i Ġ< Ġdata . length ) Ġ{ ĊĠĠĠĠĠ Ġresult . add ( data . substring ( i )) ĊĠĠĠĠĠ Ġbreak ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġwhile Ġ( c Ġ!= Ġnull ) ĊĊĠ Ġreturn Ġresult Ċ } Ċ Ċ // Ġcheck ĠisEmpty Ġbefore Ċ @ Jvm Over loads Ċ fun ĠCredentials . serialize ( store Password : ĠBoolean Ġ= Ġtrue ) Ġ= Ġjoin Data ( userName , Ġif Ġ( store Password ) Ġpassword Ġelse Ġnull ) !! Ċ Ċ fun ĠSecure String ( value : ĠCharSequence ) Ġ= ĠSecure String ( Charsets . UTF _ 8 . encode ( Char Buffer . wrap ( value )). toByteArray ()) Ċ Ċ class ĠSecure String ( value : ĠByteArray ) Ġ{ ĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġprivate Ġval Ġencryption Support Ġ= ĠEncryption Support ( SecretKey Spec ( generate Aes Key (), Ġ" AES ")) ĊĠ Ġ} ĊĊĠ Ġprivate Ġval Ġdata Ġ= Ġencryption Support . encrypt ( value ) ĊĊĠ Ġfun Ġget ( clear able : ĠBoolean Ġ= Ġtrue ) Ġ= ĠOne Time String ( encryption Support . decrypt ( data ), Ġclear able Ġ= Ġclear able ) Ċ }