From 97802320151b1eb63f4d9d133c503e01a0bc5db7 Mon Sep 17 00:00:00 2001 From: heck Date: Mon, 12 Jul 2021 00:53:13 +0200 Subject: [PATCH] add group_join() --- src/group_manager_api.cc | 39 +++++++++++++++++++++++--------- src/group_manager_api.h | 30 ++++++++++++++++++++++++- src/grp_driver_dummy.cc | 43 +++++++++++++++++++++++++++++++++++- src/grp_driver_dummy.hh | 7 +++++- src/grp_driver_engine.cc | 12 +++++++++- src/grp_driver_engine.hh | 5 +++++ src/grp_driver_replicator.cc | 36 ++++++++++++++++++++++++++++++ src/grp_driver_replicator.hh | 5 +++++ src/grp_manager_interface.hh | 5 +++++ 9 files changed, 168 insertions(+), 14 deletions(-) diff --git a/src/group_manager_api.cc b/src/group_manager_api.cc index 067af19..1e5b735 100644 --- a/src/group_manager_api.cc +++ b/src/group_manager_api.cc @@ -1,7 +1,7 @@ // This file is under GNU General Public License 3.0 // see LICENSE.txt //#include - +// clang-format off #include "group_manager_api.h" #include "grp_driver_replicator.hh" #include "pEpLog.hh" @@ -23,17 +23,21 @@ DYNAMIC_API PEP_STATUS adapter_group_init() { PEP_STATUS status; try { - const string lm_dummy_db_filename = "listman_dummy.db"; + const string lm_dummy_db_filename = "groups.db"; #ifdef WIN32 const string lm_dummy_db_path = string(::per_user_directory()) + "\\" + lm_dummy_db_filename; #else const string lm_dummy_db_path = string(::per_user_directory()) + "/" + lm_dummy_db_filename; #endif - grp_drv_dummy = make_shared(lm_dummy_db_path); - grp_drv_engine = make_shared(); + + if(!grp_drv_dummy) { + grp_drv_dummy = make_shared(lm_dummy_db_path); + } + if(!grp_drv_engine) { + grp_drv_engine = make_shared(); + } adapter_grp_manager.set_replication_source(*grp_drv_dummy.get()); adapter_grp_manager.set_replication_destination(*grp_drv_engine.get()); -// adapter_grp_manager.logger.set_enabled(true); } catch (const std::exception &e) { pEpLog(Utils::nested_exception_to_string(e)); status = PEP_UNKNOWN_ERROR; @@ -54,14 +58,19 @@ DYNAMIC_API PEP_STATUS adapter_group_create( identity_list *memberlist) { pEpLog("called"); - PEP_STATUS status = adapter_grp_manager - .adapter_group_create(session, group_identity, manager, memberlist); + PEP_STATUS status = adapter_grp_manager.adapter_group_create( + session, + group_identity, + manager, + memberlist); return status; } -DYNAMIC_API PEP_STATUS -adapter_group_dissolve(PEP_SESSION session, pEp_identity *group_identity, pEp_identity *manager) +DYNAMIC_API PEP_STATUS adapter_group_dissolve( + PEP_SESSION session, + pEp_identity *group_identity, + pEp_identity *manager) { pEpLog("called"); PEP_STATUS status = adapter_grp_manager.adapter_group_dissolve(session, group_identity, manager); @@ -81,7 +90,7 @@ DYNAMIC_API PEP_STATUS adapter_group_invite_member( return status; } -PEP_STATUS adapter_group_remove_member( +DYNAMIC_API PEP_STATUS adapter_group_remove_member( PEP_SESSION session, pEp_identity *group_identity, pEp_identity *group_member) @@ -94,6 +103,16 @@ PEP_STATUS adapter_group_remove_member( return status; } +DYNAMIC_API PEP_STATUS adapter_group_join( + PEP_SESSION session, + pEp_identity *group_identity, + pEp_identity *as_member) +{ + pEpLog("called"); + PEP_STATUS status = adapter_grp_manager.adapter_group_join(session, group_identity, as_member); + return status; +} + /************************************************************************************************* * Group query functions *************************************************************************************************/ diff --git a/src/group_manager_api.h b/src/group_manager_api.h index 2456d01..2925220 100644 --- a/src/group_manager_api.h +++ b/src/group_manager_api.h @@ -129,12 +129,40 @@ DYNAMIC_API PEP_STATUS adapter_group_invite_member( * @todo Revamp implementation and execute key reset * */ -PEP_STATUS adapter_group_remove_member( +DYNAMIC_API PEP_STATUS adapter_group_remove_member( PEP_SESSION session, pEp_identity *group_identity, pEp_identity *group_member); + +/** + * + * + * @brief Join a group for which we have received an invitation, marking + * our own membership in the database for the group and sending the manager + * a confirmation of the acceptance of the invitation + * + * @param[in] session associated session object + * @param[in] group_identity the pEp_identity object representing the group. Must contain at least + * a user_id and address + * @param[in] as_member the pEp_identity object representing the own identity we want to use to + * join the group. This must match the identity which was invited to the group. + * Must contain a user_id and address. + * + * @retval PEP_STATUS_OK on success + * error on failure + * + * @ownership FIXME + * + * + */ +DYNAMIC_API PEP_STATUS adapter_group_join( + PEP_SESSION session, + pEp_identity *group_identity, + pEp_identity *as_member +); + /************************************************************************************************* * Group query functions *************************************************************************************************/ diff --git a/src/grp_driver_dummy.cc b/src/grp_driver_dummy.cc index 6c214ab..cf67383 100644 --- a/src/grp_driver_dummy.cc +++ b/src/grp_driver_dummy.cc @@ -214,6 +214,47 @@ namespace pEp { return status; } + PEP_STATUS GroupDriverDummy::adapter_group_join( + PEP_SESSION session, + pEp_identity *group_identity, + pEp_identity *as_member) noexcept + { + pEpLogClass("called"); + // TODO: listmanager member db list_join() +// PEP_STATUS status = PEP_UNKNOWN_ERROR; + +// if (!group_identity || !group_member) { +// status = PEP_ILLEGAL_VALUE; +// } else { +// if (Utils::is_c_str_empty(group_identity->address) || +// Utils::is_c_str_empty(group_member->address)) { +// status = PEP_ILLEGAL_VALUE; +// } else { +// const string addr_list{ group_identity->address }; +// const string addr_member{ group_member->address }; +// +// try { +// lmd.member_remove(addr_list, addr_member); +// status = PEP_STATUS_OK; +// } catch (const MemberDoesNotExistException &e) { +// pEpLogClass(Utils::nested_exception_to_string(e)); +// // TODO: Silently succeed??? +// status = PEP_STATUS_OK; +// } catch (const ListDoesNotExistException &e) { +// pEpLogClass(Utils::nested_exception_to_string(e)); +// status = PEP_GROUP_NOT_FOUND; +// } catch (const exception &e) { +// pEpLogClass(Utils::nested_exception_to_string(e)); +// status = PEP_UNKNOWN_ERROR; +// } catch (...) { +// pEpLogClass("unknown exception"); +// status = PEP_UNKNOWN_ERROR; +// } +// } +// } + return PEP_STATUS_OK; + } + PEP_STATUS GroupDriverDummy::group_query_groups(PEP_SESSION session, identity_list **groups) noexcept { pEpLogClass("called"); @@ -302,7 +343,7 @@ namespace pEp { if (!session || !group) { status = PEP_ILLEGAL_VALUE; } else { - if (!Utils::is_c_str_empty(group->address)) { + if (Utils::is_c_str_empty(group->address)) { status = PEP_ILLEGAL_VALUE; } else { const string addr_grp{ group->address }; diff --git a/src/grp_driver_dummy.hh b/src/grp_driver_dummy.hh index 90e53df..1c72da0 100644 --- a/src/grp_driver_dummy.hh +++ b/src/grp_driver_dummy.hh @@ -13,7 +13,7 @@ namespace pEp { class GroupDriverDummy : public GroupManagerInterface { public: GroupDriverDummy() = delete; - GroupDriverDummy(const std::string &db_path); + explicit GroupDriverDummy(const std::string &db_path); // GroupUpdateInterface PEP_STATUS adapter_group_create( @@ -37,6 +37,11 @@ namespace pEp { ::pEp_identity *group_identity, ::pEp_identity *group_member) noexcept override; + PEP_STATUS adapter_group_join( + ::PEP_SESSION session, + ::pEp_identity *group_identity, + ::pEp_identity *as_member) noexcept override; + // GroupQueryInterface PEP_STATUS group_query_groups(::PEP_SESSION session, ::identity_list **groups) noexcept override; diff --git a/src/grp_driver_engine.cc b/src/grp_driver_engine.cc index d066022..2a37574 100644 --- a/src/grp_driver_engine.cc +++ b/src/grp_driver_engine.cc @@ -9,7 +9,8 @@ namespace pEp { namespace Adapter { bool GroupDriverEngine::log_enabled = false; - GroupDriverEngine::GroupDriverEngine() { + GroupDriverEngine::GroupDriverEngine() + { pEpLogClass("called"); } @@ -49,5 +50,14 @@ namespace pEp { pEpLogClass("called"); return ::group_remove_member(session, group_identity, group_member); } + + PEP_STATUS GroupDriverEngine::adapter_group_join( + PEP_SESSION session, + pEp_identity *group_identity, + pEp_identity *as_member) noexcept + { + pEpLogClass("called"); + return ::group_join(session, group_identity, as_member); + } } // namespace Adapter } // namespace pEp \ No newline at end of file diff --git a/src/grp_driver_engine.hh b/src/grp_driver_engine.hh index 268e617..caec9f9 100644 --- a/src/grp_driver_engine.hh +++ b/src/grp_driver_engine.hh @@ -34,6 +34,11 @@ namespace pEp { ::pEp_identity *group_identity, ::pEp_identity *group_member) noexcept override; + PEP_STATUS adapter_group_join( + ::PEP_SESSION session, + ::pEp_identity *group_identity, + ::pEp_identity *as_member) noexcept override; + // Logging static bool log_enabled; Adapter::pEpLog::pEpLogger logger{ "GroupDriverEngine", log_enabled }; diff --git a/src/grp_driver_replicator.cc b/src/grp_driver_replicator.cc index 00c857e..44206dd 100644 --- a/src/grp_driver_replicator.cc +++ b/src/grp_driver_replicator.cc @@ -175,6 +175,42 @@ namespace pEp { return status; } + PEP_STATUS GroupDriverReplicator::adapter_group_join( + ::PEP_SESSION session, + ::pEp_identity *group_identity, + ::pEp_identity *as_member) noexcept + { + pEpLogClass("called"); + if (!has_repl_src_and_dst()) { + return PEP_UNKNOWN_ERROR; + } + + // Do listmanager + PEP_STATUS status = repl_src->adapter_group_join( + session, + group_identity, + as_member); + if (status != PEP_STATUS_OK) { + return status; + } + + // Do engine + status = repl_dst->adapter_group_join(session, group_identity, as_member); + if (status != PEP_STATUS_OK) { + // Rollback + // TODO: need group_leave +// PEP_STATUS rb_stat = repl_src->adapter_group( +// session, +// group_identity, +// as_member); +// if (rb_stat != PEP_STATUS_OK) { +// //FATAL ERROR ON ROLLBACK +// status = (PEP_STATUS)-9999; +// } + } + return status; + } + // GroupQueryInterface PEP_STATUS GroupDriverReplicator::group_query_groups( PEP_SESSION session, diff --git a/src/grp_driver_replicator.hh b/src/grp_driver_replicator.hh index aacb4eb..ee0586e 100644 --- a/src/grp_driver_replicator.hh +++ b/src/grp_driver_replicator.hh @@ -40,6 +40,11 @@ namespace pEp { ::pEp_identity *group_identity, ::pEp_identity *group_member) noexcept override; + PEP_STATUS adapter_group_join( + ::PEP_SESSION session, + ::pEp_identity *group_identity, + ::pEp_identity *as_member) noexcept override; + // GroupQueryInterface PEP_STATUS group_query_groups(::PEP_SESSION session, ::identity_list **groups) noexcept override; diff --git a/src/grp_manager_interface.hh b/src/grp_manager_interface.hh index 61349cc..6f39226 100644 --- a/src/grp_manager_interface.hh +++ b/src/grp_manager_interface.hh @@ -31,6 +31,11 @@ namespace pEp { ::pEp_identity *group_identity, ::pEp_identity *group_member) noexcept = 0; + virtual PEP_STATUS adapter_group_join( + ::PEP_SESSION session, + ::pEp_identity *group_identity, + ::pEp_identity *as_member) noexcept = 0; + private: };