#include "grp_driver_dummy.hh" #include "pEpLog.hh" #include "utils.hh" #include "std_utils.hh" #include #include "listmanager_dummy.hh" using namespace std; namespace pEp { namespace Adapter { bool GroupDriverDummy::log_enabled = false; GroupDriverDummy::GroupDriverDummy(const std::string &db_path) : lmd(ListManagerDummy(db_path)) { pEpLogClass("called"); } PEP_STATUS GroupDriverDummy::adapter_group_create( PEP_SESSION session, pEp_identity *group_identity, pEp_identity *manager, identity_list *memberlist) noexcept { pEpLogClass("called"); PEP_STATUS status = PEP_UNKNOWN_ERROR; if (!group_identity || !manager) { status = PEP_ILLEGAL_VALUE; } else { if (Utils::is_c_str_empty(group_identity->address) || Utils::is_c_str_empty(manager->address)) { status = PEP_ILLEGAL_VALUE; } else { const string addr_list{ group_identity->address }; const string addr_manager{ manager->address }; try { lmd.list_add(addr_list, addr_manager); status = PEP_STATUS_OK; } catch (const AlreadyExistsException &e) { pEpLogClass(Utils::nested_exception_to_string(e)); status = PEP_GROUP_EXISTS; } catch (const exception &e) { pEpLogClass(Utils::nested_exception_to_string(e)); status = PEP_UNKNOWN_ERROR; } catch (...) { pEpLogClass("unknown exception"); status = PEP_UNKNOWN_ERROR; } if (status == PEP_STATUS_OK) { // Add the memberlist (if given) // Fail totally on the first member_invite() that fails const vector cxx_memberlist = Utils::to_cxx(*memberlist); for (pEp_identity *const member : cxx_memberlist) { status = this->adapter_group_invite_member(session, group_identity, member); if (status != PEP_STATUS_OK) { status = status; break; } } } } } return status; } // The engine checks if the manager is correct for the group given // But the list manager does not require that // So, we verify that first, too. using moderator() PEP_STATUS GroupDriverDummy::adapter_group_dissolve( PEP_SESSION session, pEp_identity *group_identity, pEp_identity *manager) noexcept { pEpLogClass("called"); PEP_STATUS status = PEP_UNKNOWN_ERROR; if (!group_identity || !manager) { status = PEP_ILLEGAL_VALUE; } else { if (Utils::is_c_str_empty(group_identity->address) || Utils::is_c_str_empty(manager->address)) { status = PEP_ILLEGAL_VALUE; } else { const string addr_list{ group_identity->address }; const string addr_manager{ manager->address }; // Check if given manager is correct for the given group string addr_manager_queried; try { addr_manager_queried = lmd.moderator(addr_list); 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; } if (status == PEP_STATUS_OK) { if (addr_manager_queried != addr_manager) { status = PEP_CANNOT_DISABLE_GROUP; } else { try { lmd.list_delete(addr_list); 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 status; } PEP_STATUS GroupDriverDummy::adapter_group_invite_member( PEP_SESSION session, pEp_identity *group_identity, pEp_identity *group_member) noexcept { pEpLogClass("called"); 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_add(addr_list, addr_member); status = PEP_STATUS_OK; } catch (const AlreadyExistsException &e) { // TODO: Silently succeed??? pEpLogClass(Utils::nested_exception_to_string(e)); status = PEP_STATUS_OK; } catch (const ListDoesNotExistException &e) { pEpLogClass(Utils::nested_exception_to_string(e)); return 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 status; } PEP_STATUS GroupDriverDummy::adapter_group_remove_member( PEP_SESSION session, pEp_identity *group_identity, pEp_identity *group_member) noexcept { pEpLogClass("called"); 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 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"); PEP_STATUS status = PEP_UNKNOWN_ERROR; if (!session) { status = PEP_ILLEGAL_VALUE; } else { vector lists_queried; try { lists_queried = lmd.lists(); status = PEP_STATUS_OK; } catch (const exception &e) { pEpLogClass(Utils::nested_exception_to_string(e)); status = PEP_UNKNOWN_ERROR; } catch (...) { pEpLogClass("unknown exception"); status = PEP_UNKNOWN_ERROR; } if (status == PEP_STATUS_OK) { ::identity_list *idl_groups = ::new_identity_list(nullptr); for (const string &addr_list : lists_queried) { ::pEp_identity *grp_ident = ::new_identity( addr_list.c_str(), nullptr, nullptr, nullptr); ::update_identity(session, grp_ident); identity_list_add(idl_groups, grp_ident); } *groups = idl_groups; } } return status; } PEP_STATUS GroupDriverDummy::group_query_manager( PEP_SESSION session, const pEp_identity *const group, pEp_identity **manager) noexcept { pEpLogClass("called"); PEP_STATUS status = PEP_UNKNOWN_ERROR; if (!session || !group) { status = PEP_ILLEGAL_VALUE; } else { const string addr_list{ group->address }; string addr_manager{}; try { addr_manager = lmd.moderator(addr_list); 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; } if (status == PEP_STATUS_OK) { ::pEp_identity *manager_queried = ::new_identity( addr_manager.c_str(), nullptr, nullptr, nullptr); ::update_identity(session, manager_queried); *manager = manager_queried; } } return status; } PEP_STATUS GroupDriverDummy::group_query_members( PEP_SESSION session, const pEp_identity *const group, identity_list **members) noexcept { pEpLogClass("called"); PEP_STATUS status = PEP_UNKNOWN_ERROR; if (!session || !group) { status = PEP_ILLEGAL_VALUE; } else { if (Utils::is_c_str_empty(group->address)) { status = PEP_ILLEGAL_VALUE; } else { const string addr_grp{ group->address }; vector members_queried; try { members_queried = lmd.members(addr_grp); 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; } if (status == PEP_STATUS_OK) { ::identity_list *idl_members = ::new_identity_list(nullptr); for (const string &addr_member : members_queried) { ::pEp_identity *member_ident = ::new_identity( addr_member.c_str(), nullptr, nullptr, nullptr); ::update_identity(session, member_ident); identity_list_add(idl_members, member_ident); } *members = idl_members; } } } return status; } } // namespace Adapter } // namespace pEp