This commit is contained in:
2026-09-29 14:39:48 +07:00
parent 45daeba8a6
commit c6dd2bb1ce
3 changed files with 12 additions and 30 deletions
+1 -11
View File
@@ -110,17 +110,7 @@ fn deleted_ids(authors: &BTreeMap<EventId, PublicKey>, deletes: &[Event]) -> BTr
.iter() .iter()
.filter(|event| event.kind == Kind::EventDeletion) .filter(|event| event.kind == Kind::EventDeletion)
{ {
for tag in event.tags.iter() { for id in event.tags.event_ids() {
let fields = tag.as_slice();
if fields.len() < 2 || fields[0] != "e" {
continue;
}
let Ok(id) = EventId::from_hex(&fields[1]) else {
continue;
};
if authors.get(&id) == Some(&event.pubkey) { if authors.get(&id) == Some(&event.pubkey) {
deleted.insert(id); deleted.insert(id);
} }
+5 -19
View File
@@ -9,10 +9,10 @@ use concord::cord02::{self, ControlFold, ImageRef};
use concord::cord04::AuthorityCitation; use concord::cord04::AuthorityCitation;
use concord::cord04::roles::{Permissions, citation_ok}; use concord::cord04::roles::{Permissions, citation_ok};
use concord::cord05::{ use concord::cord05::{
self, BundleState, ChannelGrant, CommunityInvite, InviteEntry, InviteList, ParsedInviteLink, self, BundleState, CommunityInvite, InviteEntry, InviteList, ParsedInviteLink,
}; };
use concord::derive::{ use concord::derive::{
TOKEN_LEN, channel_group_key, control_group_key, control_signer_group_key, guestbook_group_key, channel_group_key, control_group_key, control_signer_group_key, guestbook_group_key,
invite_bundle_key, invite_bundle_key,
}; };
use concord::state::{CommunityState, HeldKey, HeldRoot, list_entry}; use concord::state::{CommunityState, HeldKey, HeldRoot, list_entry};
@@ -225,25 +225,11 @@ where
S: AsyncGetPublicKey + AsyncSignEvent + AsyncNip44 + ?Sized, S: AsyncGetPublicKey + AsyncSignEvent + AsyncNip44 + ?Sized,
{ {
let link_signer = Keys::generate(); let link_signer = Keys::generate();
let token = cord05::mint_token()?;
let mut token = [0u8; TOKEN_LEN];
token.copy_from_slice(&link_signer.secret_key().as_secret_bytes()[..TOKEN_LEN]);
let bundle_key = invite_bundle_key(&token); let bundle_key = invite_bundle_key(&token);
let relays: Vec<String> = state.relays.iter().map(|relay| relay.to_string()).collect(); let relays: Vec<String> = state.relays.iter().map(|relay| relay.to_string()).collect();
let channels = state
.channels
.iter()
.map(|channel| ChannelGrant {
id: channel.id,
key: channel.key.map(|key| HEXLOWER.encode(&key)),
epoch: channel.epoch,
name: channel.name.clone(),
extra: Default::default(),
})
.collect();
let invite = CommunityInvite { let invite = CommunityInvite {
community_id: state.id, community_id: state.id,
owner: state.owner, owner: state.owner,
@@ -251,7 +237,7 @@ where
community_root: HEXLOWER.encode(&state.community_root), community_root: HEXLOWER.encode(&state.community_root),
root_epoch: state.root_epoch, root_epoch: state.root_epoch,
control_pk: state.control_pks.get(&state.root_epoch.0).copied(), control_pk: state.control_pks.get(&state.root_epoch.0).copied(),
channels, channels: Vec::new(),
relays: relays.clone(), relays: relays.clone(),
name: state.name.clone().unwrap_or_default(), name: state.name.clone().unwrap_or_default(),
icon: None, icon: None,
@@ -273,7 +259,7 @@ where
community_id: state.id, community_id: state.id,
url: url.clone(), url: url.clone(),
label: None, label: None,
created_at: Timestamp::now().as_secs().saturating_mul(1000), created_at: Timestamp::now().as_secs(),
expires_at: None, expires_at: None,
extra: Default::default(), extra: Default::default(),
}; };
+6
View File
@@ -396,6 +396,12 @@ pub fn bundle_naddr(link_signer: &PublicKey) -> Result<String, InviteError> {
.map_err(|_| InviteError::BadLink("invalid naddr")) .map_err(|_| InviteError::BadLink("invalid naddr"))
} }
pub fn mint_token() -> Result<[u8; TOKEN_LEN], InviteError> {
let mut token = [0u8; TOKEN_LEN];
crate::fill_random(&mut token).map_err(crypto_error)?;
Ok(token)
}
pub fn build_invite_url( pub fn build_invite_url(
base: &str, base: &str,
link_signer: &PublicKey, link_signer: &PublicKey,