11use std:: cell:: RefCell ;
22use std:: collections:: HashMap ;
33use std:: rc:: Rc ;
4+ use std:: sync:: { Arc , RwLock } ;
45
56use async_trait:: async_trait;
67
@@ -135,14 +136,14 @@ pub struct Credential {
135136
136137#[ derive( Clone ) ]
137138pub struct Credentials {
138- keyring : Rc < dyn LightKeyring > ,
139- creds : Rc < RefCell < HashMap < String , Credential > > > ,
139+ keyring : Arc < dyn LightKeyring + Send + Sync > ,
140+ creds : Arc < RwLock < HashMap < String , Credential > > > ,
140141}
141142
142143impl Credentials {
143144 pub async fn new ( ) -> anyhow:: Result < Self > {
144145 let mut this = Self {
145- keyring : Rc :: new ( RealKeyring {
146+ keyring : Arc :: new ( RealKeyring {
146147 keyring : oo7:: Keyring :: new ( )
147148 . await
148149 . expect ( "Failed to start Secret Service" ) ,
@@ -154,7 +155,7 @@ impl Credentials {
154155 }
155156 pub async fn new_nullable ( credentials : Vec < Credential > ) -> anyhow:: Result < Self > {
156157 let mut this = Self {
157- keyring : Rc :: new ( NullableKeyring :: with_credentials ( credentials) ) ,
158+ keyring : Arc :: new ( NullableKeyring :: with_credentials ( credentials) ) ,
158159 creds : Default :: default ( ) ,
159160 } ;
160161 this. load ( ) . await ?;
@@ -168,12 +169,13 @@ impl Credentials {
168169 . await
169170 . map_err ( |e| capnp:: Error :: failed ( e. to_string ( ) ) ) ?;
170171
171- self . creds . borrow_mut ( ) . clear ( ) ;
172+ let mut lock = self . creds . write ( ) . unwrap ( ) ;
173+ lock. clear ( ) ;
172174 for item in values {
173175 let attrs = item
174176 . attributes ( )
175177 . await ;
176- self . creds . borrow_mut ( ) . insert (
178+ lock . insert (
177179 attrs[ "server" ] . to_string ( ) ,
178180 Credential {
179181 username : attrs[ "username" ] . to_string ( ) ,
@@ -184,14 +186,14 @@ impl Credentials {
184186 Ok ( ( ) )
185187 }
186188 pub fn get ( & self , server : & str ) -> Option < Credential > {
187- self . creds . borrow ( ) . get ( server) . cloned ( )
189+ self . creds . read ( ) . unwrap ( ) . get ( server) . cloned ( )
188190 }
189191 pub fn list_all ( & self ) -> HashMap < String , Credential > {
190- self . creds . borrow ( ) . clone ( )
192+ self . creds . read ( ) . unwrap ( ) . clone ( )
191193 }
192194 pub async fn insert ( & self , server : & str , username : & str , password : & str ) -> anyhow:: Result < ( ) > {
193195 {
194- if let Some ( cred) = self . creds . borrow ( ) . get ( server) {
196+ if let Some ( cred) = self . creds . read ( ) . unwrap ( ) . get ( server) {
195197 if cred. username != username {
196198 anyhow:: bail!( "You can add only one account per server" ) ;
197199 }
@@ -207,7 +209,7 @@ impl Credentials {
207209 . await
208210 . map_err ( |e| capnp:: Error :: failed ( e. to_string ( ) ) ) ?;
209211
210- self . creds . borrow_mut ( ) . insert (
212+ self . creds . write ( ) . unwrap ( ) . insert (
211213 server. to_string ( ) ,
212214 Credential {
213215 username : username. to_string ( ) ,
@@ -219,7 +221,8 @@ impl Credentials {
219221 pub async fn delete ( & self , server : & str ) -> anyhow:: Result < ( ) > {
220222 let creds = {
221223 self . creds
222- . borrow ( )
224+ . read ( )
225+ . unwrap ( )
223226 . get ( server)
224227 . ok_or ( anyhow:: anyhow!( "server creds not found" ) ) ?
225228 . clone ( )
@@ -234,7 +237,8 @@ impl Credentials {
234237 . await
235238 . map_err ( |e| capnp:: Error :: failed ( e. to_string ( ) ) ) ?;
236239 self . creds
237- . borrow_mut ( )
240+ . write ( )
241+ . unwrap ( )
238242 . remove ( server)
239243 . ok_or ( anyhow:: anyhow!( "server creds not found" ) ) ?;
240244 Ok ( ( ) )
0 commit comments