package Ġde . j ep fa . y apm . service . io Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . content . pm . PackageManager Ċ import Ġandroid . net . Uri Ċ import Ġandroid . text . TextUtils Ċ import Ġandroid . util . Log Ċ import Ġcom . google . gson .* Ċ import Ġcom . google . gson . reflect . Type Token Ċ import Ġde . j ep fa . y apm . model . encrypted . Enc Credential Ċ import Ġde . j ep fa . y apm . model . encrypted . Enc Label Ċ import Ġde . j ep fa . y apm . model . encrypted . Encrypted Ċ import Ġde . j ep fa . y apm . model . export .* Ċ import Ġde . j ep fa . y apm . model . secret . Password Ċ import Ġde . j ep fa . y apm . service . Preference Service Ċ import Ġde . j ep fa . y apm . service . secret . Android Key Ċ import Ġde . j ep fa . y apm . service . secret . Salt Service Ċ import Ġde . j ep fa . y apm . service . secret . Secret Service Ċ import Ġde . j ep fa . y apm . ui . Y apm App Ċ import Ġde . j ep fa . y apm . util . Constants Ċ import Ġde . j ep fa . y apm . util . Debug Info Ċ import Ġde . j ep fa . y apm . util . File Util Ċ import Ġjava . lang . reflect . Type Ċ import Ġjava . util .* ĊĊ Ċ object ĠVault Export Service Ġ{ ĊĊĠĠĠ Ġconst Ġval ĠJSON _ APP _ VERSION _ CODE Ġ= Ġ" app Version Code " ĊĠĠĠ Ġconst Ġval ĠJSON _ APP _ VERSION _ NAME Ġ= Ġ" app Version Name " ĊĠĠĠ Ġconst Ġval ĠJSON _ CRE ATION _ DATE Ġ= Ġ" creation Date " ĊĠĠĠ Ġconst Ġval ĠJSON _ VA ULT _ ID Ġ= Ġ" vault Id " ĊĠĠĠ Ġconst Ġval ĠJSON _ VA ULT _ VERSION Ġ= Ġ" vault Version " ĊĠĠĠ Ġconst Ġval ĠJSON _ CIPHER _ ALGORITHM Ġ= Ġ" cipher Al gor itm " ĊĠĠĠ Ġconst Ġval ĠJSON _ ENC _ MK Ġ= Ġ" enc Mk " ĊĠĠĠ Ġconst Ġval ĠJSON _ CRED ENTIAL S Ġ= Ġ" credentials " ĊĠĠĠ Ġconst Ġval ĠJSON _ CRED ENTIAL S _ COUNT Ġ= Ġ" credentials Count " ĊĠĠĠ Ġconst Ġval ĠJSON _ LABEL S Ġ= Ġ" labels " ĊĠĠĠ Ġconst Ġval ĠJSON _ LABEL S _ COUNT Ġ= Ġ" labels Count " ĊĠĠĠ Ġconst Ġval ĠJSON _ APP _ SETTINGS Ġ= Ġ" app Settings " ĊĊĠĠĠ Ġval ĠC RED ENTIAL S _ TYPE : ĠType Ġ= Ġobject Ġ: ĠType Token < List < Enc Credential >>() Ġ{} . type ĊĠĠĠ Ġval ĠLABEL S _ TYPE : ĠType Ġ= Ġobject Ġ: ĠType Token < List < Enc Label >>() Ġ{} . type ĊĊĠĠĠ Ġclass ĠEn crypted Serializer Ġ: ĠJsonSerializer < Encrypted > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( src : ĠEn crypted ?, ĠtypeOf Src : ĠType ?, Ġcontext : ĠJson Serialization Context ?): ĠJson Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJson Primitive ( it . to Base 6 4 String ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJson Primitive ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠPassword Serializer Ġ: ĠJsonSerializer < Password > Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( src : ĠPassword ?, ĠtypeOf Src : ĠType ?, Ġcontext : ĠJson Serialization Context ?): ĠJson Element Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsrc ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJson Primitive ( it . to Base 6 4 String ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJson Primitive ("") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval ĠG SON : ĠGson Ġ= ĠGson Builder () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. register Type Adapter ( Encrypted :: class . java , ĠEn crypted Serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. register Type Adapter ( Password :: class . java , Password Serializer ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. create () ĊĊĠĠĠ Ġfun Ġcredential ToJson ( credential : ĠEn c Export able Credential ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠG SON . toJson ( Export Container ( TYPE _ ENC _ CRED ENTIAL _ RECORD , Ġcredential )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcredential ToJson ( credential : ĠPlain Share able Credential ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠG SON . toJson ( Export Container ( TYPE _ PLAIN _ CRED ENTIAL _ RECORD , Ġcredential )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate Vault File ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġapp : ĠY apm App , ĊĠĠĠĠĠĠĠ Ġinclude Master key : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġinclude Preferences : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġuri : ĠUri ĊĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjson Data Ġ= Ġexport ToJson ( context , Ġapp , Ġinclude Master key , Ġinclude Preferences ) ĊĠĠĠĠĠĠĠ Ġval Ġsuccess Ġ= Ġwrite Export File ( context , Ġuri , Ġjson Data ) ĊĠĠĠĠĠĠĠ Ġreturn Ġsuccess ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġparse Vault FileContent ( content : ĠString ): ĠJsonObject ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠJson Parser . parse String ( content ). as JsonObject ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" JSON ", Ġ" cannot Ġparse ĠJSON ", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrite Export File ( context : ĠContext , Ġuri : ĠUri , Ġjson Data : ĠJsonObject ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsuccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= ĠFile Util . writeFile ( context , Ġuri , Ġjson Data . toString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcontent : ĠString ? Ġ= ĠFile Util . readFile ( context , Ġuri ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( TextUtils . isEmpty ( content )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" BACKUP ", Ġ" Empty Ġfile Ġcreated : Ġ$ uri ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsuccess Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" BACKUP ", Ġ" Cannot Ġwrite Ġfile Ġ$ uri ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġsuccess ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġexport ToJson ( context : ĠContext , Ġapp : ĠY apm App , Ġinclude Master key : ĠBoolean , Ġinclude Preferences : ĠBoolean ): ĠJsonObject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġroot Ġ= ĠJsonObject () ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . addProperty ( JSON _ APP _ VERSION _ CODE , ĠDebug Info . getVersion Code ( context )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . addProperty ( JSON _ APP _ VERSION _ NAME , ĠDebug Info . getVersion Name ( context )) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠPackage Manager . Name NotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠLog . e (" BACKUP ALL ", Ġ" cannot Ġget Ġversion Ġcode ", Ġe ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġroot . addProperty ( JSON _ CRE ATION _ DATE , ĠDate (). time ) ĊĠĠĠĠĠĠĠ Ġval Ġsalt Ġ= ĠS alt Service . getS alt As Base 6 4 String ( context ) ĊĠĠĠĠĠĠĠ Ġsalt . let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . addProperty ( JSON _ VA ULT _ ID , Ġit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġvault Version Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPreference Service . get AsString ( Preference Service . DATA _ VA ULT _ VERSION , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠConstants . UNKNOWN _ VA ULT _ VERSION . toString () ĊĠĠĠĠĠĠĠ Ġroot . addProperty ( JSON _ VA ULT _ VERSION , Ġvault Version ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcipher Algorithm Ġ= ĠSecret Service . getC ipher Algorithm ( context ) ĊĠĠĠĠĠĠĠ Ġroot . addProperty ( JSON _ CIPHER _ ALGORITHM , Ġcipher Algorithm . name ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( include Master key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenc Stored Master Key Ġ= ĠPreference Service . get Encrypted ( Preference Service . DATA _ ENCRYPT ED _ MASTER _ KEY , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( enc Stored Master Key Ġ!= Ġnull ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmk Key Ġ= ĠSecret Service . get Android SecretKey ( Android Key . ALIAS _ KEY _ MK , Ġcontext ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenc Master Key Base 6 4 Ġ= ĠSecret Service . decrypt Encrypted ( mk Key , Ġenc Stored Master Key ). to Base 6 4 String () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroot . addProperty ( JSON _ ENC _ MK , Ġenc Master Key Base 6 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġcredentials Ġ= Ġapp . credential Repository . getAll Sync () ĊĊĠĠĠĠĠĠĠ Ġroot . add ( JSON _ CRED ENTIAL S , ĠG SON . toJson Tree ( credentials , ĠC RED ENTIAL S _ TYPE )) ĊĠĠĠĠĠĠĠ Ġroot . addProperty ( JSON _ CRED ENTIAL S _ COUNT , Ġcredentials . size ) ĊĊĊĠĠĠĠĠĠĠ Ġval Ġlabels Ġ= Ġapp . label Repository . getAll Sync () ĊĊĠĠĠĠĠĠĠ Ġroot . add ( JSON _ LABEL S , ĠG SON . toJson Tree ( labels , ĠLABEL S _ TYPE )) ĊĠĠĠĠĠĠĠ Ġroot . addProperty ( JSON _ LABEL S _ COUNT , Ġlabels . size ) ĊĊĠĠĠĠĠĠĠ Ġif Ġ( include Preferences ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġall Prefs Ġ= ĠPreference Service . getAll Prefs ( context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot . add ( JSON _ APP _ SETTINGS , ĠG SON . toJson Tree ( all Prefs )) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġroot ĊĠĠĠ Ġ} Ċ Ċ }