diff --git a/src/jamidht/archive_account_manager.cpp b/src/jamidht/archive_account_manager.cpp index cbd033b3cc7c7affbcf6a9eac9e5209ff5459b60..092be925aa41739be84dc8bf6edb6bc3fe8b9441 100644 --- a/src/jamidht/archive_account_manager.cpp +++ b/src/jamidht/archive_account_manager.cpp @@ -320,7 +320,6 @@ toString(AuthDecodingState state) namespace PayloadKey { static constexpr auto passwordCorrect = "passwordCorrect"sv; static constexpr auto canRetry = "canRetry"sv; -static constexpr auto archiveTransferredWithoutFailure = "archiveTransferredWithoutFailure"sv; static constexpr auto accData = "accData"sv; static constexpr auto authScheme = "authScheme"sv; static constexpr auto password = "password"sv; @@ -721,25 +720,25 @@ ArchiveAccountManager::startLoadArchiveFromDevice(const std::shared_ptr<AuthCont return len; } - // decode msg decodingCtx->pac.reserve_buffer(len); std::copy_n(buf, len, decodingCtx->pac.buffer()); decodingCtx->pac.buffer_consumed(len); - msgpack::object_handle oh; AuthMsg toRecv; try { - JAMI_DEBUG("[LinkDevice] NEW: Unpacking message."); - decodingCtx->pac.next(oh); - oh.get().convert(toRecv); + msgpack::object_handle oh; + if (decodingCtx->pac.next(oh)) { + JAMI_DEBUG("[LinkDevice] NEW: Unpacking message."); + oh.get().convert(toRecv); + } else { + return len; + } } catch (const std::exception& e) { - ctx->linkDevCtx->state - = AuthDecodingState::ERR; // set the generic error state in the context - JAMI_ERROR("[LinkDevice] Error unpacking message from Old Device."); - // TODO: shutdown? + ctx->linkDevCtx->state = AuthDecodingState::ERR; + JAMI_ERROR("[LinkDevice] Error unpacking message from source device: {}", e.what()); return len; } - JAMI_DEBUG("[LinkDevice] NEW: Successfully unpacked message from EXPORTING\n{}", + JAMI_DEBUG("[LinkDevice] NEW: Successfully unpacked message from source\n{}", toRecv.formatMsg()); JAMI_DEBUG("[LinkDevice] NEW: State is {}:{}", ctx->linkDevCtx->scheme, @@ -747,11 +746,8 @@ ArchiveAccountManager::startLoadArchiveFromDevice(const std::shared_ptr<AuthCont // check if scheme is supported if (toRecv.schemeId != 0) { - JAMI_WARNING( - "[LinkDevice] NEW: Unsupported scheme received from a connection."); - ctx->linkDevCtx->state - = AuthDecodingState::ERR; // set the generic error state in the context - // TODO: shutdown? + JAMI_WARNING("[LinkDevice] NEW: Unsupported scheme received from source"); + ctx->linkDevCtx->state = AuthDecodingState::ERR; return len; } @@ -815,6 +811,7 @@ ArchiveAccountManager::startLoadArchiveFromDevice(const std::shared_ptr<AuthCont } if (!shouldLoadArchive) { + JAMI_DEBUG("[LinkDevice] NEW: no archive received."); // at this point we suppose to have archive. If not, export failed. // Update state and signal will be handeled onShutdown ctx->linkDevCtx->state = AuthDecodingState::ERR; @@ -859,7 +856,7 @@ ArchiveAccountManager::startLoadArchiveFromDevice(const std::shared_ptr<AuthCont // send first message to establish scheme AuthMsg toSend; toSend.schemeId = 0; // set latest scheme here - JAMI_DEBUG("[LinkDevice] NEW: Packing first message for EXPORTING.\nCurrent state is: " + JAMI_DEBUG("[LinkDevice] NEW: Packing first message for SOURCE.\nCurrent state is: " "\n\tauth " "state = {}:{}", toSend.schemeId, @@ -903,7 +900,7 @@ ArchiveAccountManager::addDevice(const std::string& uriProvided, auto gen = Manager::instance().getSeededRandomEngine(); std::uniform_int_distribution<int32_t> dist(1, INT32_MAX); auto token = dist(gen); - JAMI_WARNING("[LinkDevice] EXPORTING: Creating auth context, token: {}.", token); + JAMI_WARNING("[LinkDevice] SOURCE: Creating auth context, token: {}.", token); auto ctx = std::make_shared<AuthContext>(); ctx->accountId = accountId_; ctx->token = token; @@ -952,12 +949,12 @@ ArchiveAccountManager::doAddDevice(std::string_view scheme, const std::shared_ptr<dhtnet::ChannelSocket>& channel) { if (ctx->canceled) { - JAMI_WARNING("[LinkDevice] EXPORTING: addDevice canceled."); + JAMI_WARNING("[LinkDevice] SOURCE: addDevice canceled."); channel->shutdown(); return false; } - JAMI_DEBUG("[LinkDevice] Setting up addDevice logic on EXPORTING device."); - JAMI_DEBUG("[LinkDevice] EXPORTING: Creating addDeviceCtx."); + JAMI_DEBUG("[LinkDevice] Setting up addDevice logic on SOURCE device."); + JAMI_DEBUG("[LinkDevice] SOURCE: Creating addDeviceCtx."); ctx->addDeviceCtx = std::make_unique<AddDeviceContext>(channel); ctx->addDeviceCtx->authScheme = scheme; ctx->addDeviceCtx->state = AuthDecodingState::HANDSHAKE; @@ -989,9 +986,9 @@ ArchiveAccountManager::doAddDevice(std::string_view scheme, } }); - JAMI_DEBUG("[LinkDevice] EXPORTING: Creating callbacks."); + JAMI_DEBUG("[LinkDevice] SOURCE: Creating callbacks."); channel->onShutdown([ctx, w = weak()]() { - JAMI_DEBUG("[LinkDevice] EXPORTING: Shutdown with state {}... xfer {}uccessful", + JAMI_DEBUG("[LinkDevice] SOURCE: Shutdown with state {}... xfer {}uccessful", ctx->addDeviceCtx->formattedAuthState(), ctx->addDeviceCtx->archiveTransferredWithoutFailure ? "s" : "uns"); // check if the archive was successfully loaded and emitSignal @@ -1019,7 +1016,7 @@ ArchiveAccountManager::doAddDevice(std::string_view scheme, wthis = weak(), decodeCtx = std::make_shared<ArchiveAccountManager::DecodingContext>()]( const uint8_t* buf, size_t len) { - JAMI_DEBUG("[LinkDevice] Setting up receiver callback for communication logic on EXPORTING " + JAMI_DEBUG("[LinkDevice] Setting up receiver callback for communication logic on SOURCE " "device."); // when archive is sent to newDev we will get back a success or fail response before the // connection closes and we need to handle this and pass it to the shutdown callback @@ -1044,30 +1041,30 @@ ArchiveAccountManager::doAddDevice(std::string_view scheme, decodeCtx->pac.buffer_consumed(len); // handle unpacking the data from the peer - JAMI_DEBUG("[LinkDevice] EXPORTING: addDevice: setOnRecv: handling msg from NEW"); + JAMI_DEBUG("[LinkDevice] SOURCE: addDevice: setOnRecv: handling msg from NEW"); msgpack::object_handle oh; AuthMsg toRecv; try { - decodeCtx->pac.next(oh); - oh.get().convert(toRecv); - // print out contents of the protocol message for debugging purposes - JAMI_DEBUG("[LinkDevice] EXPORTING: Successfully unpacked message from NEW " - "(NEW->EXPORTING)\n{}", - toRecv.formatMsg()); + if (decodeCtx->pac.next(oh)) { + oh.get().convert(toRecv); + JAMI_DEBUG("[LinkDevice] SOURCE: Successfully unpacked message from NEW " + "(NEW->SOURCE)\n{}", + toRecv.formatMsg()); + } else { + return len; + } } catch (const std::exception& e) { // set the generic error state in the context ctx->addDeviceCtx->state = AuthDecodingState::ERR; - JAMI_ERROR("[LinkDevice] error unpacking message from msgpack"); // also warn in logs + JAMI_ERROR("[LinkDevice] error unpacking message from new device: {}", e.what()); // also warn in logs } - // TODO add n:STATE to handle higher scheme versioning - JAMI_DEBUG("[LinkDevice] EXPORTING: State is '{}'", ctx->addDeviceCtx->formattedAuthState()); + JAMI_DEBUG("[LinkDevice] SOURCE: State is '{}'", ctx->addDeviceCtx->formattedAuthState()); // It's possible to start handling different protocol scheme numbers here // one possibility is for multi-account xfer in the future // validate the scheme if (toRecv.schemeId != 0) { - // set the generic error state in the context ctx->addDeviceCtx->state = AuthDecodingState::ERR; JAMI_WARNING("[LinkDevice] Unsupported scheme received from a connection."); } @@ -1090,7 +1087,7 @@ ArchiveAccountManager::doAddDevice(std::string_view scheme, if (ctx->addDeviceCtx->state == AuthDecodingState::AUTH) { // receive the incoming password, check if the password is right, and send back the // archive if it is correct - JAMI_DEBUG("[LinkDevice] EXPORTING: addDevice: setOnRecv: verifying sent " + JAMI_DEBUG("[LinkDevice] SOURCE: addDevice: setOnRecv: verifying sent " "credentials from NEW"); shouldSendMsg = true; const auto& passwordIt = toRecv.find(PayloadKey::password); @@ -1098,7 +1095,6 @@ ArchiveAccountManager::doAddDevice(std::string_view scheme, // try and decompress archive for xfer try { JAMI_DEBUG("[LinkDevice] Injecting account archive into outbound message."); - ctx->addDeviceCtx->accData = this_ ->readArchive(fileutils::ARCHIVE_AUTH_SCHEME_PASSWORD, @@ -1106,9 +1102,9 @@ ArchiveAccountManager::doAddDevice(std::string_view scheme, .serialize(); shouldSendArchive = true; JAMI_DEBUG("[LinkDevice] Sending account archive."); - } catch (...) { + } catch (const std::exception& e) { ctx->addDeviceCtx->state = AuthDecodingState::ERR; - JAMI_DEBUG("[LinkDevice] Finished reading archive: FAILURE"); + JAMI_DEBUG("[LinkDevice] Finished reading archive: FAILURE: {}", e.what()); shouldSendArchive = false; } } @@ -1134,7 +1130,7 @@ ArchiveAccountManager::doAddDevice(std::string_view scheme, } if (shouldSendArchive) { - JAMI_DEBUG("[LinkDevice] EXPORTING: Archive in message has encryption scheme '{}'", + JAMI_DEBUG("[LinkDevice] SOURCE: Archive in message has encryption scheme '{}'", ctx->addDeviceCtx->authScheme); emitSignal<libjami::ConfigurationSignal::AddDeviceStateChanged>( ctx->accountId, @@ -1144,20 +1140,10 @@ ArchiveAccountManager::doAddDevice(std::string_view scheme, shouldShutdown = true; shouldSendMsg = true; ctx->addDeviceCtx->archiveTransferredWithoutFailure = true; - try { - JAMI_DEBUG("[LinkDevice] EXPORTING: Trying to send archive to NEW."); - toSend.set(PayloadKey::accData, ctx->addDeviceCtx->accData); - JAMI_DEBUG("[LinkDevice] EXPORTING: Sending archive to NEW."); - } catch (const std::exception& e) { - JAMI_ERROR("[LinkDevice] EXPORTING: Error preparing archive for xfer: {}", e.what()); - ctx->addDeviceCtx->state = AuthDecodingState::ERR; - ctx->addDeviceCtx->archiveTransferredWithoutFailure = false; - toSend.payload.clear(); - toSend.set(PayloadKey::archiveTransferredWithoutFailure, "false"); - } + toSend.set(PayloadKey::accData, ctx->addDeviceCtx->accData); } if (shouldSendMsg) { - JAMI_DEBUG("[LinkDevice] EXPORTING: Sending msg to NEW:\n{}", toSend.formatMsg()); + JAMI_DEBUG("[LinkDevice] SOURCE: Sending msg to NEW:\n{}", toSend.formatMsg()); msgpack::sbuffer buffer(UINT16_MAX); msgpack::pack(buffer, toSend); std::error_code ec; @@ -1223,7 +1209,7 @@ ArchiveAccountManager::confirmAddDevice(uint32_t token) dht::ThreadPool::io().run([ctx] { ctx->addDeviceCtx->state = AuthDecodingState::AUTH; AuthMsg toSend; - JAMI_DEBUG("[LinkDevice] EXPORTING: Packing first message for NEW and switching to " + JAMI_DEBUG("[LinkDevice] SOURCE: Packing first message for NEW and switching to " "state: {}", ctx->addDeviceCtx->formattedAuthState()); toSend.set(PayloadKey::authScheme, ctx->addDeviceCtx->authScheme);