mirror of
https://github.com/deuxfleurs-org/garage.git
synced 2026-07-26 07:58:14 +00:00
GetKeyInfo: properly list locally-aliased buckets even if they have no permissions
This commit is contained in:
+25
-20
@@ -188,30 +188,34 @@ async fn key_info_results(
|
|||||||
key: Key,
|
key: Key,
|
||||||
show_secret: bool,
|
show_secret: bool,
|
||||||
) -> Result<GetKeyInfoResponse, Error> {
|
) -> Result<GetKeyInfoResponse, Error> {
|
||||||
let mut relevant_buckets = HashMap::new();
|
|
||||||
|
|
||||||
let key_state = key.state.as_option().unwrap();
|
let key_state = key.state.as_option().unwrap();
|
||||||
|
|
||||||
for id in key_state
|
let buckets1 = key_state
|
||||||
.authorized_buckets
|
.authorized_buckets
|
||||||
.items()
|
.items()
|
||||||
.iter()
|
.iter()
|
||||||
.map(|(id, _)| id)
|
.filter(|(_, p)| p.is_any())
|
||||||
.chain(
|
.map(|(id, _)| id);
|
||||||
key_state
|
let buckets2 = key_state
|
||||||
.local_aliases
|
.local_aliases
|
||||||
.items()
|
.items()
|
||||||
.iter()
|
.iter()
|
||||||
.filter_map(|(_, _, v)| v.inner()),
|
.filter_map(|(_, _, v)| v.inner());
|
||||||
) {
|
|
||||||
if !relevant_buckets.contains_key(id) {
|
let mut relevant_buckets = HashMap::new();
|
||||||
if let Some(b) = garage.bucket_table.get(&EmptyKey, id).await? {
|
for bucket_id in buckets1.chain(buckets2) {
|
||||||
if b.state.as_option().is_some() {
|
if !relevant_buckets.contains_key(bucket_id) {
|
||||||
relevant_buckets.insert(*id, b);
|
if let Some(b) = garage.bucket_table.get(&EmptyKey, bucket_id).await? {
|
||||||
}
|
relevant_buckets.insert(*bucket_id, b);
|
||||||
|
} else {
|
||||||
|
warn!(
|
||||||
|
"Key {} references non-existent bucket {:?}",
|
||||||
|
key.key_id, bucket_id
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
relevant_buckets.retain(|_, b| !b.is_deleted());
|
||||||
|
|
||||||
let res = GetKeyInfoResponse {
|
let res = GetKeyInfoResponse {
|
||||||
name: key_state.name.get().clone(),
|
name: key_state.name.get().clone(),
|
||||||
@@ -233,7 +237,7 @@ async fn key_info_results(
|
|||||||
},
|
},
|
||||||
buckets: relevant_buckets
|
buckets: relevant_buckets
|
||||||
.into_values()
|
.into_values()
|
||||||
.filter_map(|bucket| {
|
.map(|bucket| {
|
||||||
let state = bucket.state.as_option().unwrap();
|
let state = bucket.state.as_option().unwrap();
|
||||||
let permissions = key_state
|
let permissions = key_state
|
||||||
.authorized_buckets
|
.authorized_buckets
|
||||||
@@ -243,8 +247,9 @@ async fn key_info_results(
|
|||||||
read: p.allow_read,
|
read: p.allow_read,
|
||||||
write: p.allow_write,
|
write: p.allow_write,
|
||||||
owner: p.allow_owner,
|
owner: p.allow_owner,
|
||||||
})?;
|
})
|
||||||
Some(KeyInfoBucketResponse {
|
.unwrap_or_default();
|
||||||
|
KeyInfoBucketResponse {
|
||||||
id: hex::encode(bucket.id),
|
id: hex::encode(bucket.id),
|
||||||
global_aliases: state
|
global_aliases: state
|
||||||
.aliases
|
.aliases
|
||||||
@@ -261,7 +266,7 @@ async fn key_info_results(
|
|||||||
.map(|((_, n), _, _)| n.to_string())
|
.map(|((_, n), _, _)| n.to_string())
|
||||||
.collect::<Vec<_>>(),
|
.collect::<Vec<_>>(),
|
||||||
permissions,
|
permissions,
|
||||||
})
|
}
|
||||||
})
|
})
|
||||||
.collect::<Vec<_>>(),
|
.collect::<Vec<_>>(),
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user