/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠNew ĠVector ĠLtd Ċ Ġ* Ċ Ġ* Ġ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 Ġim . vector . app . features . crypto . keys Ċ Ċ import Ġandroid . content . Context Ċ import Ġandroid . net . Uri Ċ import Ġim . vector . app . core . dispatch ers . Coroutine Dispatch ers Ċ import Ġim . vector . app . core . extensions . safe Open OutputStream Ċ import Ġkotlinx . coroutines . with Context Ċ import Ġorg . matrix . android . sdk . api . session . Session Ċ import Ġjavax . inject . Inject Ċ Ċ class ĠKeys Exporter Ġ@ Inject Ġconstructor ( ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġsession : ĠSession , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdispatch ers : ĠCor outine Dispatch ers Ċ ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠExport Ġkeys Ġand Ġwrite Ġthem Ġto Ġthe Ġprovided Ġuri . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġsuspend Ġfun Ġexport ( password : ĠString , Ġuri : ĠUri ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwith Context ( dispatch ers . io ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdata Ġ= Ġsession . crypto Service (). export Room Keys ( password ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . safe Open OutputStream ( uri ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . use Ġ{ Ġit . write ( data ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalStateException (" Unable Ġto Ġopen Ġfile Ġfor Ġwriting ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġverify Exported Keys Output FileSize ( uri , Ġexpected Size Ġ= Ġdata . size . to Long ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġverify Exported Keys Output FileSize ( uri : ĠUri , Ġexpected Size : ĠLong ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġoutput Ġ= Ġcontext . content Resolver . open FileDescriptor ( uri , Ġ" r ", Ġnull ) ĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput Ġ== Ġnull ĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ-> Ġthrow ĠIllegalStateException (" Exported Ġfile Ġnot Ġfound ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġoutput . stat Size Ġ!= Ġexpected Size Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠUnexpected Export Keys FileSize Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected FileSize Ġ= Ġexpected Size , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual FileSize Ġ= Ġoutput . stat Size ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠUnexpected Export Keys FileSize Exception ( expected FileSize : ĠLong , Ġactual FileSize : ĠLong ) Ġ: ĠIllegalStateException ( ĊĠĠĠĠĠĠĠ Ġ" Exported ĠKeys Ġfile Ġhas Ġunexpected Ġfile Ġsize , Ġgot : Ġ$ actual FileSize Ġbut Ġexpected : Ġ$ expected FileSize " Ċ ) Ċ