Cancel local streams when signed membership is invalidated
This commit is contained in:
1 parent
c250e703f7
commit
a62540800b
4 files changed
+55
-27
No files matched your search
@@ -888,6 +888,7 @@ int member_sync_verify_and_purge(struct UTUN_INSTANCE* inst, const char* ch_id)
|
||||
topo_node_sqlite_member_del(db, ch_id, nid);
|
||||
radio_forget_member_mute(inst, strtoull(ch_id, NULL, 10), nid);
|
||||
merkle_sync_recompute_path(inst, MT_DATA_MEMBERS, ch_id, nid);
|
||||
_fire_props_changed(inst, nid, NULL, ch_id);
|
||||
/* пассивное удаление: если узел подключён напрямую — убрать из CHAT-группы */
|
||||
if (inst->topo_groups) {
|
||||
uint64_t gid = strtoull(ch_id, NULL, 10);
|
||||
|
||||
+8
-2
@@ -224,14 +224,20 @@ static void member_changed(uint64_t node_id, const char *tags, const char *chann
|
||||
struct stream_service *service = arg;
|
||||
if (service->stopping || !service->sessions) return;
|
||||
for (struct stream_session *s = service->sessions; s; s = s->next) {
|
||||
if (s->closing || s->source || s->descriptor.source_node_id != node_id) continue;
|
||||
int own = node_id == service->inst->node_id;
|
||||
if (s->closing || (!own && (s->source || s->descriptor.source_node_id != node_id))) continue;
|
||||
struct TOPO_GROUP *group = stream_group(service->inst, s->descriptor.group_id);
|
||||
if (!group || !channel || strcmp(group->channel_id, channel)) continue;
|
||||
struct stream_member_state state; uint8_t key[32];
|
||||
int result = stream_member_load(service->inst, group->group_id, node_id, &state, key);
|
||||
if (result == STREAM_ERR_NOT_MEMBER || result == STREAM_ERR_SIGNATURE || result == STREAM_ERR_FORMAT) {
|
||||
s->invalidated = 1; s->reason = STREAM_CLOSE_MEMBER;
|
||||
} else if (result == STREAM_OK && (memcmp(key, s->public_key, 32)
|
||||
DEBUG_WARN(DEBUG_CATEGORY_STREAM, "stream membership invalidated group=%llx member=%llx own=%d result=%d",
|
||||
(unsigned long long)group->group_id, (unsigned long long)node_id, own, result);
|
||||
} else if (own && result == STREAM_OK && memcmp(key, service->inst->my_ed25519_pubkey, 32)) {
|
||||
s->invalidated = 1; s->reason = STREAM_CLOSE_MEMBER;
|
||||
DEBUG_WARN(DEBUG_CATEGORY_STREAM, "stream own member key changed group=%llx", (unsigned long long)group->group_id);
|
||||
} else if (!own && result == STREAM_OK && (memcmp(key, s->public_key, 32)
|
||||
|| (state.published && (state.source.source_epoch != s->descriptor.source_epoch
|
||||
|| state.source.n != s->descriptor.n || state.source.r != s->descriptor.r
|
||||
|| state.source.block_size != s->descriptor.block_size)))) {
|
||||
|
||||
Reference in new issue
Block a user