diff --git a/map/bookmark_catalog.cpp b/map/bookmark_catalog.cpp index 1fbac7a9a5..046f42cefa 100644 --- a/map/bookmark_catalog.cpp +++ b/map/bookmark_catalog.cpp @@ -257,6 +257,8 @@ void BookmarkCatalog::Download(std::string const & id, std::string const & name, downloadResult = DownloadResult::Success; break; case platform::RemoteFile::Status::Forbidden: + if (m_onInvalidToken) + m_onInvalidToken(); downloadResult = DownloadResult::AuthError; break; case platform::RemoteFile::Status::NotFound: @@ -463,7 +465,7 @@ void BookmarkCatalog::Upload(UploadData uploadData, std::string const & accessTo return; } - GetPlatform().RunTask(Platform::Thread::File, [uploadData = std::move(uploadData), accessToken, fileData, + GetPlatform().RunTask(Platform::Thread::File, [this, uploadData = std::move(uploadData), accessToken, fileData, pathToKmb, uploadSuccessCallback = std::move(uploadSuccessCallback), uploadErrorCallback = std::move(uploadErrorCallback)]() mutable { @@ -482,7 +484,7 @@ void BookmarkCatalog::Upload(UploadData uploadData, std::string const & accessTo return; } - GetPlatform().RunTask(Platform::Thread::Network, [uploadData = std::move(uploadData), accessToken, + GetPlatform().RunTask(Platform::Thread::Network, [this, uploadData = std::move(uploadData), accessToken, pathToKmb, fileData, originalSha1, uploadSuccessCallback = std::move(uploadSuccessCallback), uploadErrorCallback = std::move(uploadErrorCallback)]() mutable @@ -495,6 +497,9 @@ void BookmarkCatalog::Upload(UploadData uploadData, std::string const & accessTo auto const resultCode = RequestNewServerId(accessToken, serverId, errorString); if (resultCode == 403) { + if (m_onInvalidToken) + m_onInvalidToken(); + if (uploadErrorCallback) uploadErrorCallback(UploadResult::AuthError, errorString); return; @@ -570,6 +575,9 @@ void BookmarkCatalog::Upload(UploadData uploadData, std::string const & accessTo } else if (uploadCode.m_httpCode == 403) { + if (m_onInvalidToken) + m_onInvalidToken(); + if (uploadErrorCallback) uploadErrorCallback(UploadResult::AuthError, uploadCode.m_description); } @@ -592,3 +600,8 @@ void BookmarkCatalog::Upload(UploadData uploadData, std::string const & accessTo }); }); } + +void BookmarkCatalog::SetInvalidTokenHandler(InvalidTokenHandler && onInvalidToken) +{ + m_onInvalidToken = std::move(onInvalidToken); +} diff --git a/map/bookmark_catalog.hpp b/map/bookmark_catalog.hpp index fbab763810..bb8008d4ac 100644 --- a/map/bookmark_catalog.hpp +++ b/map/bookmark_catalog.hpp @@ -50,6 +50,7 @@ public: uint32_t maxTagsCount)>; using CustomProperties = std::vector; using CustomPropertiesCallback = platform::SafeCallback; + using InvalidTokenHandler = std::function; void RegisterByServerId(std::string const & id); void UnregisterByServerId(std::string const & id); @@ -116,7 +117,11 @@ public: UploadSuccessCallback && uploadSuccessCallback, UploadErrorCallback && uploadErrorCallback); + // Handler can be called from non-UI thread. + void SetInvalidTokenHandler(InvalidTokenHandler && onInvalidToken); + private: std::map m_downloadingIds; std::set m_registeredInCatalog; + InvalidTokenHandler m_onInvalidToken; }; diff --git a/map/bookmark_manager.cpp b/map/bookmark_manager.cpp index d64e7bee1e..b16f15154a 100644 --- a/map/bookmark_manager.cpp +++ b/map/bookmark_manager.cpp @@ -501,6 +501,7 @@ BookmarkManager::BookmarkManager(User & user, Callbacks && callbacks) std::bind(&BookmarkManager::OnRestoredFilesPrepared, this)); m_bookmarkCloud.SetInvalidTokenHandler([this] { m_user.ResetAccessToken(); }); + m_bookmarkCatalog.SetInvalidTokenHandler([this] { m_user.ResetAccessToken(); }); } BookmarkManager::EditSession BookmarkManager::GetEditSession() diff --git a/map/framework.cpp b/map/framework.cpp index cbc2bd1a14..d5eea08a8c 100644 --- a/map/framework.cpp +++ b/map/framework.cpp @@ -428,7 +428,7 @@ Framework::Framework(FrameworkParams const & params) , m_lastReportedCountry(kInvalidCountryId) , m_popularityLoader(m_model.GetDataSource()) , m_descriptionsLoader(std::make_unique(m_model.GetDataSource())) - , m_purchase(std::make_unique()) + , m_purchase(std::make_unique([this] { m_user.ResetAccessToken(); })) , m_tipsApi(static_cast(*this)) { CHECK(IsLittleEndian(), ("Only little-endian architectures are supported.")); diff --git a/map/purchase.cpp b/map/purchase.cpp index 8fc408026d..a325c41686 100644 --- a/map/purchase.cpp +++ b/map/purchase.cpp @@ -105,7 +105,8 @@ struct ValidationResult }; } // namespace -Purchase::Purchase() +Purchase::Purchase(InvalidTokenHandler && onInvalidToken) + : m_onInvalidToken(std::move(onInvalidToken)) { std::string id; if (GetPlatform().GetSecureStorage().Load(kSubscriptionId, id)) @@ -242,6 +243,9 @@ void Purchase::ValidateImpl(std::string const & url, ValidationInfo const & vali } else if (resultCode == 403) { + if (m_onInvalidToken) + m_onInvalidToken(); + code = ValidationCode::AuthError; } else if (resultCode >= 400 && resultCode < 500) diff --git a/map/purchase.hpp b/map/purchase.hpp index 95f9ddcd80..dde8bc40d3 100644 --- a/map/purchase.hpp +++ b/map/purchase.hpp @@ -22,7 +22,9 @@ public: class Purchase { public: - Purchase(); + using InvalidTokenHandler = std::function; + + explicit Purchase(InvalidTokenHandler && onInvalidToken); void RegisterSubscription(SubscriptionListener * listener); bool IsSubscriptionActive(SubscriptionType type) const; @@ -74,6 +76,7 @@ private: ValidationCallback m_validationCallback; StartTransactionCallback m_startTransactionCallback; + InvalidTokenHandler m_onInvalidToken; ThreadChecker m_threadChecker; };