From df609a0ff8e7b5f97d27a4e7065dd10d9a25b1e7 Mon Sep 17 00:00:00 2001 From: Ivan Baidakou Date: Tue, 2 Jul 2024 21:35:50 +0300 Subject: [PATCH] core, remove uknown device when adding the same ignored --- src/model/diff/modify/add_ignored_device.cpp | 17 +++++++- src/model/diff/modify/add_ignored_device.h | 6 ++- src/model/diff/modify/remove_unknown_device.h | 2 +- src/net/db_actor.cpp | 11 +++-- tests/040-diff-contacts.cpp | 23 +++++++++++ tests/070-db.cpp | 41 ++++++++++++++++++- tests/diff-builder.cpp | 2 +- 7 files changed, 91 insertions(+), 11 deletions(-) diff --git a/src/model/diff/modify/add_ignored_device.cpp b/src/model/diff/modify/add_ignored_device.cpp index 277e358a..641045d5 100644 --- a/src/model/diff/modify/add_ignored_device.cpp +++ b/src/model/diff/modify/add_ignored_device.cpp @@ -4,13 +4,26 @@ #include "add_ignored_device.h" #include "model/cluster.h" #include "model/diff/cluster_visitor.h" +#include "model/diff/modify/remove_unknown_device.h" using namespace syncspirit::model::diff::modify; -add_ignored_device_t::add_ignored_device_t(const device_id_t &id_, db::SomeDevice db_device_) noexcept - : device_id{id_}, db_device{db_device_} {} +add_ignored_device_t::add_ignored_device_t(const cluster_t &cluster, const device_id_t &id_, + db::SomeDevice db_device_) noexcept + : device_id{id_}, db_device{db_device_} { + auto peer = cluster.get_unknown_devices().by_sha256(device_id.get_sha256()); + if (peer) { + auto diff = cluster_diff_ptr_t{}; + diff = new remove_unknown_device_t(*peer); + diffs.emplace_back(std::move(diff)); + } +} auto add_ignored_device_t::apply_impl(cluster_t &cluster) const noexcept -> outcome::result { + auto r = parent_t::apply_impl(cluster); + if (!r) { + return r; + } auto opt = ignored_device_t::create(device_id, db_device); if (!opt) { return opt.assume_error(); diff --git a/src/model/diff/modify/add_ignored_device.h b/src/model/diff/modify/add_ignored_device.h index 2e4814a2..379ef806 100644 --- a/src/model/diff/modify/add_ignored_device.h +++ b/src/model/diff/modify/add_ignored_device.h @@ -8,8 +8,10 @@ namespace syncspirit::model::diff::modify { -struct SYNCSPIRIT_API add_ignored_device_t final : cluster_diff_t { - add_ignored_device_t(const device_id_t &id, db::SomeDevice db_device) noexcept; +struct SYNCSPIRIT_API add_ignored_device_t final : cluster_aggregate_diff_t { + using parent_t = cluster_aggregate_diff_t; + + add_ignored_device_t(const cluster_t &cluster, const device_id_t &id, db::SomeDevice db_device) noexcept; outcome::result apply_impl(cluster_t &) const noexcept override; outcome::result visit(cluster_visitor_t &, void *) const noexcept override; diff --git a/src/model/diff/modify/remove_unknown_device.h b/src/model/diff/modify/remove_unknown_device.h index 49254d52..e4219094 100644 --- a/src/model/diff/modify/remove_unknown_device.h +++ b/src/model/diff/modify/remove_unknown_device.h @@ -9,7 +9,7 @@ namespace syncspirit::model::diff::modify { struct SYNCSPIRIT_API remove_unknown_device_t final : cluster_diff_t { - remove_unknown_device_t(const unknown_device_t &id) noexcept; + remove_unknown_device_t(const unknown_device_t &device) noexcept; outcome::result apply_impl(cluster_t &) const noexcept override; outcome::result visit(cluster_visitor_t &, void *) const noexcept override; diff --git a/src/net/db_actor.cpp b/src/net/db_actor.cpp index 33348b2f..a7c0f1b7 100644 --- a/src/net/db_actor.cpp +++ b/src/net/db_actor.cpp @@ -438,7 +438,7 @@ auto db_actor_t::operator()(const model::diff::modify::add_unknown_folders_t &di return commit(true); } -auto db_actor_t::operator()(const model::diff::modify::add_ignored_device_t &diff, void *) noexcept +auto db_actor_t::operator()(const model::diff::modify::add_ignored_device_t &diff, void *custom) noexcept -> outcome::result { if (cluster->is_tainted()) { return outcome::success(); @@ -448,12 +448,17 @@ auto db_actor_t::operator()(const model::diff::modify::add_ignored_device_t &dif return txn_opt.assume_error(); } auto &txn = *txn_opt.assume_value(); - auto device = cluster->get_ignored_devices().by_sha256(diff.device_id.get_sha256()); + auto r = diff.model::diff::cluster_aggregate_diff_t::visit(*this, custom); + if (r.has_error()) { + return r.assume_error(); + } + + auto device = cluster->get_ignored_devices().by_sha256(diff.device_id.get_sha256()); auto key = device->get_key(); auto data = device->serialize(); - auto r = db::save({key, data}, txn); + r = db::save({key, data}, txn); if (!r) { return r.assume_error(); } diff --git a/tests/040-diff-contacts.cpp b/tests/040-diff-contacts.cpp index e19681aa..48e5472a 100644 --- a/tests/040-diff-contacts.cpp +++ b/tests/040-diff-contacts.cpp @@ -102,3 +102,26 @@ TEST_CASE("ignored device is removed when connecting to it ", "[model]") { CHECK(cluster->get_ignored_devices().size() == 0); CHECK(cluster->get_devices().size() == 2); } + +TEST_CASE("unknown device is removed adding the same ignored device", "[model]") { + auto my_id = device_id_t::from_string("KHQNO2S-5QSILRK-YX4JZZ4-7L77APM-QNVGZJT-EKU7IFI-PNEPBMY-4MXFMQD").value(); + auto peer_id = device_id_t::from_string("VUV42CZ-IQD5A37-RPEBPM4-VVQK6E4-6WSKC7B-PVJQHHD-4PZD44V-ENC6WAZ").value(); + auto my_device = device_t::create(my_id, "my-device").value(); + + auto cluster = cluster_ptr_t(new cluster_t(my_device, 1, 1)); + auto &devices = cluster->get_devices(); + devices.put(my_device); + + db::SomeDevice db_device; + db_device.set_name("a name"); + auto buider = diff_builder_t(*cluster); + REQUIRE(buider.add_unknown_device(peer_id, db_device).apply()); + REQUIRE(cluster->get_unknown_devices().size() == 1); + REQUIRE(cluster->get_ignored_devices().size() == 0); + REQUIRE(cluster->get_devices().size() == 1); + + REQUIRE(buider.add_ignored_device(peer_id, db_device).apply()); + REQUIRE(cluster->get_unknown_devices().size() == 0); + REQUIRE(cluster->get_ignored_devices().size() == 1); + REQUIRE(cluster->get_devices().size() == 1); +} diff --git a/tests/070-db.cpp b/tests/070-db.cpp index 5f28fa7a..545f9ae8 100644 --- a/tests/070-db.cpp +++ b/tests/070-db.cpp @@ -180,7 +180,7 @@ void test_folder_creation() { F().run(); } -void test_miscellaneous() { +void test_unknown_and_ignored_devices_1() { struct F : fixture_t { void main() noexcept override { auto d_id1 = @@ -255,6 +255,42 @@ void test_miscellaneous() { F().run(); } +void test_unknown_and_ignored_devices_2() { + struct F : fixture_t { + void main() noexcept override { + auto d_id = + device_id_t::from_string("LYXKCHX-VI3NYZR-ALCJBHF-WMZYSPK-QG6QJA3-MPFYMSO-U56GTUK-NA2MIAW").value(); + + db::SomeDevice sd; + sd.set_name("x1"); + auto builder = diff_builder_t(*cluster); + + builder.add_unknown_device(d_id, sd).apply(*sup); + { + sup->request(db_addr).send(timeout); + sup->do_process(); + REQUIRE(reply); + auto cluster_clone = make_cluster(); + REQUIRE(reply->payload.res.diff->apply(*cluster_clone)); + CHECK(cluster_clone->get_unknown_devices().by_sha256(d_id.get_sha256())); + CHECK(!cluster_clone->get_ignored_devices().by_sha256(d_id.get_sha256())); + } + + builder.add_ignored_device(d_id, sd).apply(*sup); + { + sup->request(db_addr).send(timeout); + sup->do_process(); + REQUIRE(reply); + auto cluster_clone = make_cluster(); + REQUIRE(reply->payload.res.diff->apply(*cluster_clone)); + CHECK(!cluster_clone->get_unknown_devices().by_sha256(d_id.get_sha256())); + CHECK(cluster_clone->get_ignored_devices().by_sha256(d_id.get_sha256())); + } + } + }; + F().run(); +} + void test_peer_updating() { struct F : fixture_t { void main() noexcept override { @@ -810,7 +846,8 @@ void test_update_peer() { int _init() { REGISTER_TEST_CASE(test_loading_empty_db, "test_loading_empty_db", "[db]"); - REGISTER_TEST_CASE(test_miscellaneous, "test_miscellaneous", "[db]"); + REGISTER_TEST_CASE(test_unknown_and_ignored_devices_1, "test_unknown_and_ignored_devices_1", "[db]"); + REGISTER_TEST_CASE(test_unknown_and_ignored_devices_2, "test_unknown_and_ignored_devices_2", "[db]"); REGISTER_TEST_CASE(test_folder_creation, "test_folder_creation", "[db]"); REGISTER_TEST_CASE(test_peer_updating, "test_peer_updating", "[db]"); REGISTER_TEST_CASE(test_folder_sharing, "test_folder_sharing", "[db]"); diff --git a/tests/diff-builder.cpp b/tests/diff-builder.cpp index 41b235e7..55d418c2 100644 --- a/tests/diff-builder.cpp +++ b/tests/diff-builder.cpp @@ -235,7 +235,7 @@ diff_builder_t &diff_builder_t::ack_block(const model::diff::modify::block_trans diff_builder_t &diff_builder_t::add_ignored_device(const model::device_id_t &device, db::SomeDevice db_device) noexcept { - diffs.emplace_back(new diff::modify::add_ignored_device_t(device, db_device)); + diffs.emplace_back(new diff::modify::add_ignored_device_t(cluster, device, db_device)); return *this; }