88use crate :: io:: utils:: check_namespace_key_validity;
99use bitcoin:: hashes:: { sha256, Hash , HashEngine , Hmac , HmacEngine } ;
1010use lightning:: io:: { self , Error , ErrorKind } ;
11- use lightning:: util:: persist:: KVStore ;
11+ use lightning:: util:: persist:: { KVStore , MigratableKVStore } ;
1212use prost:: Message ;
1313use rand:: RngCore ;
1414#[ cfg( test) ]
@@ -84,46 +84,39 @@ impl VssStore {
8484 }
8585 }
8686
87- fn extract_key ( & self , unified_key : & str ) -> io:: Result < String > {
87+ fn key_to_key_parts < ' a > (
88+ & self , unified_key : & ' a str ,
89+ ) -> io:: Result < ( & ' a str , & ' a str , & ' a str ) > {
8890 let mut parts = unified_key. splitn ( 3 , '#' ) ;
89- let ( _primary_namespace, _secondary_namespace) = ( parts. next ( ) , parts. next ( ) ) ;
90- match parts. next ( ) {
91- Some ( obfuscated_key) => {
92- let actual_key = self . key_obfuscator . deobfuscate ( obfuscated_key) ?;
93- Ok ( actual_key)
91+ let ( primary_namespace, secondary_namespace) = ( parts. next ( ) , parts. next ( ) ) ;
92+ match ( primary_namespace, secondary_namespace, parts. next ( ) ) {
93+ ( Some ( primary_namespace) , Some ( secondary_namespace) , Some ( obfuscated_key) ) => {
94+ Ok ( ( primary_namespace, secondary_namespace, obfuscated_key) )
9495 } ,
95- None => Err ( Error :: new ( ErrorKind :: InvalidData , "Invalid key format" ) ) ,
96+ _ => Err ( Error :: new ( ErrorKind :: InvalidData , "Invalid key format" ) ) ,
9697 }
9798 }
9899
99- async fn list_all_keys (
100- & self , primary_namespace : & str , secondary_namespace : & str ,
101- ) -> io:: Result < Vec < String > > {
100+ async fn list_obfuscated_key_versions ( & self , key_prefix : String ) -> io:: Result < Vec < KeyValue > > {
102101 let mut page_token = None ;
103- let mut keys = vec ! [ ] ;
104- let key_prefix = format ! ( "{}#{}" , primary_namespace, secondary_namespace) ;
102+ let mut key_versions = vec ! [ ] ;
105103 while page_token != Some ( "" . to_string ( ) ) {
106104 let request = ListKeyVersionsRequest {
107105 store_id : self . store_id . clone ( ) ,
108- key_prefix : Some ( key_prefix. clone ( ) ) ,
106+ key_prefix : Some ( key_prefix. to_string ( ) ) ,
109107 page_token,
110108 page_size : None ,
111109 } ;
112110
113111 let response = self . client . list_key_versions ( & request) . await . map_err ( |e| {
114- let msg = format ! (
115- "Failed to list keys in {}/{}: {}" ,
116- primary_namespace, secondary_namespace, e
117- ) ;
112+ let msg = format ! ( "Failed to list keys with prefix {}: {}" , key_prefix, e) ;
118113 Error :: new ( ErrorKind :: Other , msg)
119114 } ) ?;
120115
121- for kv in response. key_versions {
122- keys. push ( self . extract_key ( & kv. key ) ?) ;
123- }
116+ key_versions. extend ( response. key_versions ) ;
124117 page_token = response. next_page_token ;
125118 }
126- Ok ( keys )
119+ Ok ( key_versions )
127120 }
128121}
129122
@@ -218,8 +211,9 @@ impl KVStore for VssStore {
218211 fn list ( & self , primary_namespace : & str , secondary_namespace : & str ) -> io:: Result < Vec < String > > {
219212 check_namespace_key_validity ( primary_namespace, secondary_namespace, None , "list" ) ?;
220213
221- let keys = tokio:: task:: block_in_place ( || {
222- self . runtime . block_on ( self . list_all_keys ( primary_namespace, secondary_namespace) )
214+ let key_prefix = format ! ( "{}#{}" , primary_namespace, secondary_namespace) ;
215+ let obfuscated_key_versions = tokio:: task:: block_in_place ( || {
216+ self . runtime . block_on ( self . list_obfuscated_key_versions ( key_prefix) )
223217 } )
224218 . map_err ( |e| {
225219 let msg = format ! (
@@ -229,7 +223,39 @@ impl KVStore for VssStore {
229223 Error :: new ( ErrorKind :: Other , msg)
230224 } ) ?;
231225
232- Ok ( keys)
226+ let mut deobfuscated_keys = vec ! [ ] ;
227+ for kv in obfuscated_key_versions {
228+ let obfuscated_key = self . key_to_key_parts ( & kv. key ) ?. 2 ;
229+ deobfuscated_keys. push ( self . key_obfuscator . deobfuscate ( obfuscated_key) ?) ;
230+ }
231+ Ok ( deobfuscated_keys)
232+ }
233+ }
234+
235+ impl MigratableKVStore for VssStore {
236+ fn list_all_keys ( & self ) -> Result < Vec < ( String , String , String ) > , Error > {
237+ // Use empty key_prefix to list all keys.
238+ let empty_key_prefix = "" . to_string ( ) ;
239+ let obfuscated_key_versions = tokio:: task:: block_in_place ( || {
240+ self . runtime . block_on ( self . list_obfuscated_key_versions ( empty_key_prefix) )
241+ } )
242+ . map_err ( |e| {
243+ let msg = format ! ( "Failed to list all keys: {}" , e) ;
244+ Error :: new ( ErrorKind :: Other , msg)
245+ } ) ?;
246+
247+ let mut deobfuscated_keys = vec ! [ ] ;
248+ for kv in obfuscated_key_versions {
249+ let ( primary_namespace, secondary_namespace, obfuscated_key) =
250+ self . key_to_key_parts ( & kv. key ) ?;
251+
252+ deobfuscated_keys. push ( (
253+ primary_namespace. to_string ( ) ,
254+ secondary_namespace. to_string ( ) ,
255+ self . key_obfuscator . deobfuscate ( & obfuscated_key) ?,
256+ ) ) ;
257+ }
258+ Ok ( deobfuscated_keys)
233259 }
234260}
235261
0 commit comments