Skip to content

Commit 0a911f0

Browse files
committed
Implement MigratableKVStore for VssStore
1 parent 9f8d30a commit 0a911f0

File tree

1 file changed

+51
-25
lines changed

1 file changed

+51
-25
lines changed

src/io/vss_store.rs

Lines changed: 51 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
use crate::io::utils::check_namespace_key_validity;
99
use bitcoin::hashes::{sha256, Hash, HashEngine, Hmac, HmacEngine};
1010
use lightning::io::{self, Error, ErrorKind};
11-
use lightning::util::persist::KVStore;
11+
use lightning::util::persist::{KVStore, MigratableKVStore};
1212
use prost::Message;
1313
use 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

Comments
 (0)