use crate::client::Client;
use log::{debug, warn};
use std::sync::Arc;
use wacore_binary::NodeRef;
const REFRESH_CHILDREN: [&str; 2] = ["companion_reg_refresh", "pair-device-rotate-qr"];
async fn rotate_companion_registration(client: &Arc<Client>) {
use rand::Rng as _;
let mut secret = [0u8; 32];
rand::make_rng::<rand::rngs::StdRng>().fill_bytes(&mut secret);
client
.persistence_manager
.process_command(wacore::store::commands::DeviceCommand::SetAdvSecretKey(
secret,
))
.await;
debug!(
target: "Client/PairRefresh",
"Rotated the adv secret the server asked to retire"
);
client.refresh_pairing_qr().await;
}
pub(super) async fn handle_companion_reg_refresh(client: &Arc<Client>, node: &NodeRef<'_>) {
if !REFRESH_CHILDREN
.iter()
.any(|tag| node.get_optional_child_by_tag(&[tag]).is_some())
{
warn!(
target: "Client/PairRefresh",
"companion_reg_refresh carries neither companion_reg_refresh nor pair-device-rotate-qr; ignoring"
);
return;
}
let state = client.pair_code_state.lock().await;
if state.awaiting_pair_success() {
debug!(
target: "Client/PairRefresh",
"Server asked to refresh companion registration; keeping the adv secret a pending pair-success depends on"
);
return;
}
rotate_companion_registration(client).await;
}