use super::*;
impl AppCore {
pub(in crate::core) fn private_sibling_control_disposition(
&mut self,
owner: PublicKey,
sender: Option<PublicKey>,
rumor: &RuntimeRumor,
) -> Option<bool> {
if !matches!(rumor.kind, 10449 | 10450 | 10452 | 10453 | 10454 | 10455) {
return None;
}
let Some(account) = self
.logged_in
.as_ref()
.filter(|account| account.owner_pubkey == owner)
else {
return Some(true);
};
let owner_hex = owner.to_hex();
let mut recipients = rumor
.tags
.iter()
.filter(|tag| tag.as_slice().first().is_some_and(|name| name == "p"));
if recipients
.next()
.is_some_and(|tag| tag.as_slice() != ["p", owner_hex.as_str()])
|| recipients.next().is_some()
{
return Some(true);
}
let current = account.device_keys.public_key();
let Some(sender) = sender.filter(|sender| *sender != current) else {
return Some(true);
};
if !self.protocol_engine.as_ref().is_some_and(|engine| {
engine.owner_device_binding_is_verified(owner, current)
&& engine.owner_device_binding_is_verified(owner, sender)
}) {
return Some(true);
}
if self.device_sync_peer_is_authorized(&sender.to_hex()) {
return None;
}
self.request_protocol_subscription_refresh();
self.fetch_recent_protocol_metadata_state();
Some(false)
}
}