Browse Source

Initialize avatar peers from the current group session epoch

master
evgeny 6 days ago
parent
commit
f8d95fcb25
  1. 8
      src/chat/group_avatar.c
  2. 11
      tools/chatgui/tests/test_group_avatars.cpp

8
src/chat/group_avatar.c

@ -166,7 +166,13 @@ static struct ga_peer* ga_find(struct group_avatar* ctx, uint64_t group, uint64_
if (!create) return NULL; if (!create) return NULL;
struct ga_peer* p = u_calloc(1, sizeof(*p)); struct ga_peer* p = u_calloc(1, sizeof(*p));
if (!p) { DEBUG_ERROR(DEBUG_CATEGORY_CHAT, "group avatar: peer allocation failed"); return NULL; } if (!p) { DEBUG_ERROR(DEBUG_CATEGORY_CHAT, "group avatar: peer allocation failed"); return NULL; }
p->owner = ctx; p->group = group; p->peer = peer; p->state_pending = 1; p->next = ctx->peers; ctx->peers = p; return p; p->owner = ctx; p->group = group; p->peer = peer; p->state_pending = 1;
struct TOPO_GROUP* g = topo_groups_find(ctx->inst->topo_groups, group);
for (struct ll_entry* e = g && g->senders_list ? g->senders_list->head : NULL; e; e = e->next) {
struct TOPO_GROUP_CONN_ITEM* item = (struct TOPO_GROUP_CONN_ITEM*)e->data;
if (item && item->node_id == peer) { p->epoch = item->local_epoch; break; }
}
p->next = ctx->peers; ctx->peers = p; return p;
} }
static int ga_allowed(struct UTUN_INSTANCE* inst, uint64_t group, uint64_t peer) { static int ga_allowed(struct UTUN_INSTANCE* inst, uint64_t group, uint64_t peer) {

11
tools/chatgui/tests/test_group_avatars.cpp

@ -49,6 +49,7 @@ private slots:
QTRY_VERIFY_WITH_TIMEOUT(!manager.image(channel).isNull(), 5000); QTRY_VERIFY_WITH_TIMEOUT(!manager.image(channel).isNull(), 5000);
QVERIFY(manager.image(channel).width() <= 128); QCOMPARE(manager.image(channel).width(), manager.image(channel).height()); QVERIFY(manager.image(channel).width() <= 128); QCOMPARE(manager.image(channel).width(), manager.image(channel).height());
const QByteArray saved = db.getChannelAvatar(channel); const QByteArray saved = db.getChannelAvatar(channel);
const ChannelRow original = db.getChannels()[0];
quint64 version = db.getChannels()[0].avatarVersion; QVERIFY(result.size() >= 2); quint64 version = db.getChannels()[0].avatarVersion; QVERIFY(result.size() >= 2);
QSignalSpy changed(&manager, &GroupAvatarManager::changed); QSignalSpy changed(&manager, &GroupAvatarManager::changed);
for (int i = 0; i < 10; i++) QVERIFY(!manager.image(channel).isNull()); QCOMPARE(changed.count(), 0); for (int i = 0; i < 10; i++) QVERIFY(!manager.image(channel).isNull()); QCOMPARE(changed.count(), 0);
@ -59,11 +60,11 @@ private slots:
ChannelSettingsDialog reader(channel, &db); ChannelSettingsDialog reader(channel, &db);
QVERIFY(!reader.findChild<QPushButton*>("uploadGroupAvatar")->isEnabled()); QVERIFY(!reader.findChild<QPushButton*>("removeGroupAvatar")->isEnabled()); QVERIFY(!reader.findChild<QPushButton*>("uploadGroupAvatar")->isEnabled()); QVERIFY(!reader.findChild<QPushButton*>("removeGroupAvatar")->isEnabled());
manager.remove(channel); QTest::qWait(50); QCOMPARE(db.getChannels()[0].avatarVersion, version); QCOMPARE(db.getChannelAvatar(channel), saved); manager.remove(channel); QTest::qWait(50); QCOMPARE(db.getChannels()[0].avatarVersion, version); QCOMPARE(db.getChannelAvatar(channel), saved);
// Закрытый ключ вернём через публичное описание группы; creator UID не используется как право. QCOMPARE(topo_node_sqlite_channel_put(instance->topo_sqlite_db, ch.constData(), original.name.toUtf8().constData(), original.ownerNodeId,
const ChannelRow row = db.getChannels()[0]; uint8_t edPrivate[32]; (const uint8_t*)original.x25519_pubkey.constData(), nullptr, (const uint8_t*)original.ed25519_pubkey.constData(),
const QByteArray configKeys = row.ed25519_pubkey; Q_UNUSED(configKeys); (const uint8_t*)original.ed25519_privkey.constData(), (const uint8_t*)original.signature.constData()), 0);
// Ключ был сохранён перед удалением в owner DTO. manager.remove(channel); QTRY_VERIFY_WITH_TIMEOUT(db.getChannels()[0].avatarVersion > version, 5000);
Q_UNUSED(edPrivate); QVERIFY(db.getChannelAvatar(channel).isEmpty()); QVERIFY(manager.image(channel).isNull());
} }
poll.stop(); chat_event_set_handler(instance, nullptr); db.setDb(nullptr); poll.stop(); chat_event_set_handler(instance, nullptr); db.setDb(nullptr);
utun_instance_destroy(instance); instance = nullptr; uasync_destroy(ua, 0); utun_instance_destroy(instance); instance = nullptr; uasync_destroy(ua, 0);

Loading…
Cancel
Save