From 1384ad8a2d7975d75aadb21b7b7978e20c0ce422 Mon Sep 17 00:00:00 2001 From: "S. Kozyr" Date: Thu, 8 Feb 2024 12:46:43 +0200 Subject: [PATCH] Migration from OAuth1 to OAuth2 Signed-off-by: S. Kozyr --- editor/changeset_wrapper.cpp | 2 +- editor/changeset_wrapper.hpp | 2 +- editor/osm_auth.cpp | 220 +++++++++++++++-------------------- editor/osm_auth.hpp | 46 ++++---- editor/osm_editor.cpp | 12 +- editor/osm_editor.hpp | 2 +- qt/mainwindow.cpp | 10 +- qt/osm_auth_dialog.cpp | 14 +-- 8 files changed, 133 insertions(+), 175 deletions(-) diff --git a/editor/changeset_wrapper.cpp b/editor/changeset_wrapper.cpp index 7a2019b514..7ca9f97be6 100644 --- a/editor/changeset_wrapper.cpp +++ b/editor/changeset_wrapper.cpp @@ -98,7 +98,7 @@ std::string DebugPrint(xml_document const & doc) namespace osm { -ChangesetWrapper::ChangesetWrapper(KeySecret const & keySecret, +ChangesetWrapper::ChangesetWrapper(std::string const & keySecret, ServerApi06::KeyValueTags comments) noexcept : m_changesetComments(std::move(comments)), m_api(OsmOAuth::ServerAuth(keySecret)) { diff --git a/editor/changeset_wrapper.hpp b/editor/changeset_wrapper.hpp index e2eaec2eeb..2ce690b3a8 100644 --- a/editor/changeset_wrapper.hpp +++ b/editor/changeset_wrapper.hpp @@ -31,7 +31,7 @@ public: DECLARE_EXCEPTION(LinearFeaturesAreNotSupportedException, ChangesetWrapperException); DECLARE_EXCEPTION(EmptyFeatureException, ChangesetWrapperException); - ChangesetWrapper(KeySecret const & keySecret, ServerApi06::KeyValueTags comments) noexcept; + ChangesetWrapper(std::string const & keySecret, ServerApi06::KeyValueTags comments) noexcept; ~ChangesetWrapper(); /// Throws many exceptions from above list, plus including XMLNode's parsing ones. diff --git a/editor/osm_auth.cpp b/editor/osm_auth.cpp index 819d689ff9..1ffbeaee69 100644 --- a/editor/osm_auth.cpp +++ b/editor/osm_auth.cpp @@ -6,9 +6,9 @@ #include "base/string_utils.hpp" -#include "private.h" +#include "cppjansson/cppjansson.hpp" -#include "3party/liboauthcpp/include/liboauthcpp/liboauthcpp.h" +#include "private.h" namespace osm { @@ -16,10 +16,6 @@ using platform::HttpClient; using std::string; constexpr char const * kApiVersion = "/api/0.6"; -constexpr char const * kFacebookCallbackPart = "/auth/facebook_access_token/callback?access_token="; -constexpr char const * kGoogleCallbackPart = "/auth/google_oauth2_access_token/callback?access_token="; -constexpr char const * kFacebookOAuthPart = "/auth/facebook?referer=%2Foauth%2Fauthorize%3Foauth_token%3D"; -constexpr char const * kGoogleOAuthPart = "/auth/google?referer=%2Foauth%2Fauthorize%3Foauth_token%3D"; namespace { @@ -38,6 +34,21 @@ string FindAuthenticityToken(string const & body) return end == string::npos ? string() : body.substr(start, end - start); } +string FindAccessToken(string const & body) +{ + // Extract access_token from JSON in format {"access_token":"...", "token_type":"Bearer", "scope":"read_prefs"} + const base::Json root(body.c_str()); + + if (json_is_object(root.get())) + { + json_t * token_node = json_object_get(root.get(), "access_token"); + if(json_is_string(token_node)) + return json_string_value(token_node); + } + + return {}; +} + string BuildPostRequest(std::initializer_list> const & params) { string result; @@ -52,18 +63,15 @@ string BuildPostRequest(std::initializer_list> const & } // namespace // static -bool OsmOAuth::IsValid(KeySecret const & ks) +bool OsmOAuth::IsValid(string const & ks) { - return !(ks.first.empty() || ks.second.empty()); -} -// static -bool OsmOAuth::IsValid(UrlRequestToken const & urt) -{ - return !(urt.first.empty() || urt.second.first.empty() || urt.second.second.empty()); + return !ks.empty(); } -OsmOAuth::OsmOAuth(string const & consumerKey, string const & consumerSecret, string baseUrl, string apiUrl) - : m_consumerKeySecret(consumerKey, consumerSecret), m_baseUrl(std::move(baseUrl)), m_apiUrl(std::move(apiUrl)) +OsmOAuth::OsmOAuth(string const & oauth2ClientId, string const & oauth2Secret, string const & oauth2Scope, + string const & oauth2RedirectUri, string baseUrl, string apiUrl) + : m_oauth2params{oauth2ClientId, oauth2Secret, oauth2Scope, oauth2RedirectUri}, + m_baseUrl(std::move(baseUrl)), m_apiUrl(std::move(apiUrl)) { } // static @@ -76,33 +84,35 @@ OsmOAuth OsmOAuth::ServerAuth() #endif } // static -OsmOAuth OsmOAuth::ServerAuth(KeySecret const & userKeySecret) +OsmOAuth OsmOAuth::ServerAuth(string const & oauthToken) { OsmOAuth auth = ServerAuth(); - auth.SetKeySecret(userKeySecret); + auth.SetAuthToken(oauthToken); return auth; } // static OsmOAuth OsmOAuth::DevServerAuth() { constexpr char const * kOsmDevServer = "https://master.apis.dev.openstreetmap.org"; - constexpr char const * kOsmDevConsumerKey = "jOxkndim5PiuIlgsYxUH8H0broKt5qJM2enN5vF5"; - constexpr char const * kOsmDevConsumerSecret = "g3jTJz6CUws3c04MHdAhbUTmnNH16ls8XxurQEIc"; - return {kOsmDevConsumerKey, kOsmDevConsumerSecret, kOsmDevServer, kOsmDevServer}; + constexpr char const * kOsmDevClientId = "nw9bW3nZ-q99SXzgnH-dlED3ueDSmFPtxl33n3hDwFU"; + constexpr char const * kOsmDevClientSecret = "nIxwFx1NXIx9lKoNmb7lAoHd9ariGMf46PtU_YG558c"; + constexpr char const * kOsmDevScope = "read_prefs"; + constexpr char const * kOsmDevRedirectUri = "om://oauth2/osm/callback"; + return {kOsmDevClientId, kOsmDevClientSecret, kOsmDevScope, kOsmDevRedirectUri, kOsmDevServer, kOsmDevServer}; } // static OsmOAuth OsmOAuth::ProductionServerAuth() { constexpr char const * kOsmMainSiteURL = "https://www.openstreetmap.org"; constexpr char const * kOsmApiURL = "https://api.openstreetmap.org"; - return {OSM_CONSUMER_KEY, OSM_CONSUMER_SECRET, kOsmMainSiteURL, kOsmApiURL}; + return {OSM_OAUTH2_CLIENT_ID, OSM_OAUTH2_CLIENT_SECRET, OSM_OAUTH2_SCOPE, OSM_OAUTH2_REDIRECT_URI, kOsmMainSiteURL, kOsmApiURL}; } -void OsmOAuth::SetKeySecret(KeySecret const & keySecret) { m_tokenKeySecret = keySecret; } +void OsmOAuth::SetAuthToken(string const & oauthToken) { m_oauth2token = oauthToken; } -KeySecret const & OsmOAuth::GetKeySecret() const { return m_tokenKeySecret; } +string const & OsmOAuth::GetAuthToken() const { return m_oauth2token; } -bool OsmOAuth::IsAuthorized() const{ return IsValid(m_tokenKeySecret); } +bool OsmOAuth::IsAuthorized() const{ return IsValid(m_oauth2token); } // Opens a login page and extract a cookie and a secret token. OsmOAuth::SessionID OsmOAuth::FetchSessionId(string const & subUrl, string const & cookies) const @@ -118,7 +128,7 @@ OsmOAuth::SessionID OsmOAuth::FetchSessionId(string const & subUrl, string const MYTHROW(FetchSessionIdError, (DebugPrint(request))); SessionID sid = { request.CombinedCookies(), FindAuthenticityToken(request.ServerResponse()) }; - if (sid.m_cookies.empty() || sid.m_token.empty()) + if (sid.m_cookies.empty() || sid.m_authenticity_token.empty()) MYTHROW(FetchSessionIdError, ("Cookies and/or token are empty for request", DebugPrint(request))); return sid; } @@ -140,7 +150,7 @@ bool OsmOAuth::LoginUserPassword(string const & login, string const & password, {"password", password}, {"referer", "/"}, {"commit", "Login"}, - {"authenticity_token", sid.m_token} + {"authenticity_token", sid.m_authenticity_token} }); HttpClient request(m_baseUrl + "/login"); request.SetBodyData(std::move(params), "application/x-www-form-urlencoded") @@ -192,43 +202,44 @@ bool OsmOAuth::LoginSocial(string const & callbackPart, string const & socialTok // Fakes a buttons press to automatically accept requested permissions. string OsmOAuth::SendAuthRequest(string const & requestTokenKey, SessionID const & lastSid) const { - // We have to get a new CSRF token, using existing cookies to open the correct page. - SessionID const & sid = - FetchSessionId("/oauth/authorize?oauth_token=" + requestTokenKey, lastSid.m_cookies); auto params = BuildPostRequest({ - {"oauth_token", requestTokenKey}, - {"oauth_callback", ""}, - {"authenticity_token", sid.m_token}, - {"allow_read_prefs", "1"}, - {"allow_write_api", "1"}, - {"allow_write_gpx", "1"}, - {"allow_write_notes", "1"}, - {"commit", "Save changes"} + {"authenticity_token", requestTokenKey}, + {"client_id", m_oauth2params.m_clientId}, + {"redirect_uri", m_oauth2params.m_redirectUri}, + {"scope", m_oauth2params.m_scope}, + {"response_type", "code"} }); - HttpClient request(m_baseUrl + "/oauth/authorize"); + HttpClient request(m_baseUrl + "/oauth2/authorize"); request.SetBodyData(std::move(params), "application/x-www-form-urlencoded") - .SetCookies(sid.m_cookies) + .SetCookies(lastSid.m_cookies) + //.SetRawHeader("Origin", m_baseUrl) .SetHandleRedirects(false); if (!request.RunHttpRequest()) MYTHROW(NetworkError, ("SendAuthRequest Network error while connecting to", request.UrlRequested())); - string const callbackURL = request.UrlReceived(); - string const vKey = "oauth_verifier="; - auto const pos = callbackURL.find(vKey); - if (pos == string::npos) - MYTHROW(SendAuthRequestError, ("oauth_verifier is not found", DebugPrint(request))); + // Recieved URL in format "{OSM_OAUTH2_REDIRECT_URI}?code=XXXX". Extract code value + string const callbackUrl = request.UrlReceived(); + auto const url = url::Url::FromString(callbackUrl); + string const * oauth2code = url.GetParamValue("code"); - auto const end = callbackURL.find('&', pos); - return callbackURL.substr(pos + vKey.length(), end == string::npos ? end : end - pos - vKey.length()); + if(oauth2code == nullptr || oauth2code->empty()) + MYTHROW(NetworkError, ("SendAuthRequest Redirect url has no code parameter", request.UrlReceived())); + return *oauth2code; } -RequestToken OsmOAuth::FetchRequestToken() const +string OsmOAuth::FetchRequestToken(SessionID const & sid) const { - OAuth::Consumer const consumer(m_consumerKeySecret.first, m_consumerKeySecret.second); - OAuth::Client oauth(&consumer); - string const requestTokenUrl = m_baseUrl + "/oauth/request_token"; - string const requestTokenQuery = oauth.getURLQueryString(OAuth::Http::Get, requestTokenUrl + "?oauth_callback=oob"); + string const requestTokenUrl = m_baseUrl + "/oauth2/authorize"; + string const requestTokenQuery = BuildPostRequest({ + {"client_id", OSM_OAUTH2_CLIENT_ID}, + {"redirect_uri", OSM_OAUTH2_REDIRECT_URI}, + {"scope", OSM_OAUTH2_SCOPE}, + {"response_type", "code"} + }); HttpClient request(requestTokenUrl + "?" + requestTokenQuery); + request.SetCookies(sid.m_cookies) + .SetHandleRedirects(false); + if (!request.RunHttpRequest()) MYTHROW(NetworkError, ("FetchRequestToken Network error while connecting to", request.UrlRequested())); if (request.ErrorCode() != HTTP::OK) @@ -237,19 +248,24 @@ RequestToken OsmOAuth::FetchRequestToken() const MYTHROW(UnexpectedRedirect, ("Redirected to", request.UrlReceived(), "from", request.UrlRequested())); // Throws std::runtime_error. - OAuth::Token const reqToken = OAuth::Token::extract(request.ServerResponse()); - return { reqToken.key(), reqToken.secret() }; + string const authenticityToken = FindAuthenticityToken(request.ServerResponse()); + return authenticityToken; } -KeySecret OsmOAuth::FinishAuthorization(RequestToken const & requestToken, - string const & verifier) const +string OsmOAuth::FinishAuthorization(string const & oauth2code) const { - OAuth::Consumer const consumer(m_consumerKeySecret.first, m_consumerKeySecret.second); - OAuth::Token const reqToken(requestToken.first, requestToken.second, verifier); - OAuth::Client oauth(&consumer, &reqToken); - string const accessTokenUrl = m_baseUrl + "/oauth/access_token"; - string const queryString = oauth.getURLQueryString(OAuth::Http::Get, accessTokenUrl, "", true); - HttpClient request(accessTokenUrl + "?" + queryString); + auto params = BuildPostRequest({ + {"grant_type", "authorization_code"}, + {"code", oauth2code}, + {"client_id", OSM_OAUTH2_CLIENT_ID}, + {"client_secret", OSM_OAUTH2_CLIENT_SECRET}, + {"redirect_uri", OSM_OAUTH2_REDIRECT_URI}, + {"scope", OSM_OAUTH2_SCOPE}, + }); + + HttpClient request(m_baseUrl + "/oauth2/token"); + request.SetBodyData(std::move(params), "application/x-www-form-urlencoded") + .SetHandleRedirects(false); if (!request.RunHttpRequest()) MYTHROW(NetworkError, ("FinishAuthorization Network error while connecting to", request.UrlRequested())); if (request.ErrorCode() != HTTP::OK) @@ -257,24 +273,20 @@ KeySecret OsmOAuth::FinishAuthorization(RequestToken const & requestToken, if (request.WasRedirected()) MYTHROW(UnexpectedRedirect, ("Redirected to", request.UrlReceived(), "from", request.UrlRequested())); - OAuth::KeyValuePairs const responseData = OAuth::ParseKeyValuePairs(request.ServerResponse()); - // Throws std::runtime_error. - OAuth::Token const accessToken = OAuth::Token::extract(responseData); - return { accessToken.key(), accessToken.secret() }; + // Parse response JSON + return FindAccessToken(request.ServerResponse()); } // Given a web session id, fetches an OAuth access token. -KeySecret OsmOAuth::FetchAccessToken(SessionID const & sid) const +string OsmOAuth::FetchAccessToken(SessionID const & sid) const { - // Acquire a request token. - RequestToken const requestToken = FetchRequestToken(); - // Faking a button press for access rights. - string const pin = SendAuthRequest(requestToken.first, sid); + string const requestToken = FetchRequestToken(sid); + string const oauth2code = SendAuthRequest(requestToken, sid); LogoutUser(sid); - // Got pin, exchange it for the access token. - return FinishAuthorization(requestToken, pin); + // Got code, exchange it for the access token. + return FinishAuthorization(oauth2code); } bool OsmOAuth::AuthorizePassword(string const & login, string const & password) @@ -282,42 +294,10 @@ bool OsmOAuth::AuthorizePassword(string const & login, string const & password) SessionID const sid = FetchSessionId(); if (!LoginUserPassword(login, password, sid)) return false; - m_tokenKeySecret = FetchAccessToken(sid); + m_oauth2token = FetchAccessToken(sid); return true; } -bool OsmOAuth::AuthorizeFacebook(string const & facebookToken) -{ - SessionID const sid = FetchSessionId(); - if (!LoginSocial(kFacebookCallbackPart, facebookToken, sid)) - return false; - m_tokenKeySecret = FetchAccessToken(sid); - return true; -} - -bool OsmOAuth::AuthorizeGoogle(string const & googleToken) -{ - SessionID const sid = FetchSessionId(); - if (!LoginSocial(kGoogleCallbackPart, googleToken, sid)) - return false; - m_tokenKeySecret = FetchAccessToken(sid); - return true; -} - -OsmOAuth::UrlRequestToken OsmOAuth::GetFacebookOAuthURL() const -{ - RequestToken const requestToken = FetchRequestToken(); - string const url = m_baseUrl + kFacebookOAuthPart + requestToken.first; - return {url, requestToken}; -} - -OsmOAuth::UrlRequestToken OsmOAuth::GetGoogleOAuthURL() const -{ - RequestToken const requestToken = FetchRequestToken(); - string const url = m_baseUrl + kGoogleOAuthPart + requestToken.first; - return {url, requestToken}; -} - /// @todo OSM API to reset password has changed and should be updated /* bool OsmOAuth::ResetPassword(string const & email) const @@ -327,7 +307,7 @@ bool OsmOAuth::ResetPassword(string const & email) const SessionID const sid = FetchSessionId(kForgotPasswordUrlPart); auto params = BuildPostRequest({ {"email", email}, - {"authenticity_token", sid.m_token}, + {"authenticity_token", sid.m_authenticity_token}, {"commit", "Reset password"}, }); HttpClient request(m_baseUrl + kForgotPasswordUrlPart); @@ -347,32 +327,14 @@ bool OsmOAuth::ResetPassword(string const & email) const OsmOAuth::Response OsmOAuth::Request(string const & method, string const & httpMethod, string const & body) const { - if (!IsValid(m_tokenKeySecret)) - MYTHROW(InvalidKeySecret, ("User token (key and secret) are empty.")); - - OAuth::Consumer const consumer(m_consumerKeySecret.first, m_consumerKeySecret.second); - OAuth::Token const oatoken(m_tokenKeySecret.first, m_tokenKeySecret.second); - OAuth::Client oauth(&consumer, &oatoken); - - OAuth::Http::RequestType reqType; - if (httpMethod == "GET") - reqType = OAuth::Http::Get; - else if (httpMethod == "POST") - reqType = OAuth::Http::Post; - else if (httpMethod == "PUT") - reqType = OAuth::Http::Put; - else if (httpMethod == "DELETE") - reqType = OAuth::Http::Delete; - else - MYTHROW(UnsupportedApiRequestMethod, ("Unsupported OSM API request method", httpMethod)); + if (!IsValid(m_oauth2token)) + MYTHROW(InvalidKeySecret, ("Auth token is empty.")); string url = m_apiUrl + kApiVersion + method; - string const query = oauth.getURLQueryString(reqType, url); - auto const qPos = url.find('?'); - if (qPos != string::npos) - url = url.substr(0, qPos); - HttpClient request(url + "?" + query); + HttpClient request(url); + request.SetRawHeader("Authorization", "Bearer " + m_oauth2token); + if (httpMethod != "GET") request.SetBodyData(body, "application/xml", httpMethod); if (!request.RunHttpRequest()) diff --git a/editor/osm_auth.hpp b/editor/osm_auth.hpp index 1ddf0936bc..a429860eba 100644 --- a/editor/osm_auth.hpp +++ b/editor/osm_auth.hpp @@ -7,8 +7,14 @@ namespace osm { -using KeySecret = std::pair; -using RequestToken = KeySecret; +struct Oauth2Params +{ + std::string m_clientId; + std::string m_clientSecret; + std::string m_scope; + std::string m_redirectUri; +}; + /// All methods that interact with the OSM server are blocking and not asynchronous. class OsmOAuth @@ -34,8 +40,6 @@ public: /// A pair of . using Response = std::pair; - /// A pair of . - using UrlRequestToken = std::pair; DECLARE_EXCEPTION(OsmOAuthException, RootException); DECLARE_EXCEPTION(NetworkError, OsmOAuthException); @@ -53,24 +57,23 @@ public: DECLARE_EXCEPTION(FinishAuthorizationServerError, OsmOAuthException); DECLARE_EXCEPTION(ResetPasswordServerError, OsmOAuthException); - static bool IsValid(KeySecret const & ks); - static bool IsValid(UrlRequestToken const & urt); + static bool IsValid(std::string const & ks); /// The constructor. Simply stores a lot of strings in fields. - OsmOAuth(std::string const & consumerKey, std::string const & consumerSecret, - std::string baseUrl, std::string apiUrl); + OsmOAuth(std::string const & oauth2ClientId, std::string const & oauth2Secret, std::string const & oauth2Scope, + std::string const & oauth2RedirectUri, std::string baseUrl, std::string apiUrl); /// Should be used everywhere in production code instead of servers below. static OsmOAuth ServerAuth(); - static OsmOAuth ServerAuth(KeySecret const & userKeySecret); + static OsmOAuth ServerAuth(std::string const & oauthToken); /// master.apis.dev.openstreetmap.org static OsmOAuth DevServerAuth(); /// api.openstreetmap.org static OsmOAuth ProductionServerAuth(); - void SetKeySecret(KeySecret const & keySecret); - KeySecret const & GetKeySecret() const; + void SetAuthToken(std::string const & authToken); + std::string const & GetAuthToken() const; bool IsAuthorized() const; /// @returns false if login and/or password are invalid. @@ -92,11 +95,7 @@ public: /// @name Methods for WebView-based authentication. //@{ - UrlRequestToken GetFacebookOAuthURL() const; - UrlRequestToken GetGoogleOAuthURL() const; - KeySecret FinishAuthorization(RequestToken const & requestToken, - std::string const & verifier) const; - // AuthResult FinishAuthorization(KeySecret const & requestToken, string const & verifier); + std::string FinishAuthorization(std::string const & oauth2code) const; std::string GetRegistrationURL() const { return m_baseUrl + "/user/new"; } std::string GetResetPasswordURL() const { return m_baseUrl + "/user/forgot-password"; } std::string GetHistoryURL(std::string const & user) const @@ -109,15 +108,16 @@ private: struct SessionID { std::string m_cookies; - std::string m_token; + std::string m_authenticity_token; }; - /// Key and secret for application. - KeySecret const m_consumerKeySecret; + /// OAuth2 parameters (including secret) for application. + Oauth2Params const m_oauth2params; std::string const m_baseUrl; std::string const m_apiUrl; - /// Key and secret to sign every OAuth request. - KeySecret m_tokenKeySecret; + /// Token to authenticate every OAuth request. + //std::string const m_oauth2code; + std::string m_oauth2token; SessionID FetchSessionId(std::string const & subUrl = "/login", std::string const & cookies = "") const; @@ -134,8 +134,8 @@ private: /// @returns non-empty string with oauth_verifier value. std::string SendAuthRequest(std::string const & requestTokenKey, SessionID const & lastSid) const; /// @returns valid key and secret or throws otherwise. - RequestToken FetchRequestToken() const; - KeySecret FetchAccessToken(SessionID const & sid) const; + std::string FetchRequestToken(SessionID const & sid) const; + std::string FetchAccessToken(SessionID const & sid) const; //AuthResult FetchAccessToken(SessionID const & sid); }; diff --git a/editor/osm_editor.cpp b/editor/osm_editor.cpp index 84a20bf2cc..fc8c6995e0 100644 --- a/editor/osm_editor.cpp +++ b/editor/osm_editor.cpp @@ -578,11 +578,11 @@ bool Editor::HaveMapEditsToUpload(MwmId const & mwmId) const return false; } -void Editor::UploadChanges(string const & key, string const & secret, ChangesetTags tags, +void Editor::UploadChanges(string const & oauthToken, ChangesetTags tags, FinishUploadCallback callback) { if (m_notes->NotUploadedNotesCount()) - m_notes->Upload(OsmOAuth::ServerAuth({key, secret})); + m_notes->Upload(OsmOAuth::ServerAuth(oauthToken)); auto const features = m_features.Get(); @@ -592,10 +592,10 @@ void Editor::UploadChanges(string const & key, string const & secret, ChangesetT return; } - auto upload = [this](string key, string secret, ChangesetTags tags, FinishUploadCallback callback) + auto upload = [this](string secret, ChangesetTags tags, FinishUploadCallback callback) { int uploadedFeaturesCount = 0, errorsCount = 0; - ChangesetWrapper changeset({key, secret}, std::move(tags)); + ChangesetWrapper changeset(secret, std::move(tags)); auto const features = m_features.Get(); for (auto const & id : *features) @@ -773,10 +773,10 @@ void Editor::UploadChanges(string const & key, string const & secret, ChangesetT if (!m_isUploadingNow) { m_isUploadingNow = true; - GetPlatform().RunTask(Platform::Thread::Network, [upload = std::move(upload), key, secret, + GetPlatform().RunTask(Platform::Thread::Network, [upload = std::move(upload), oauthToken, tags = std::move(tags), callback = std::move(callback)]() { - upload(std::move(key), std::move(secret), std::move(tags), std::move(callback)); + upload(std::move(oauthToken), std::move(tags), std::move(callback)); }); } } diff --git a/editor/osm_editor.hpp b/editor/osm_editor.hpp index f3223a9e4b..dbf0b384b5 100644 --- a/editor/osm_editor.hpp +++ b/editor/osm_editor.hpp @@ -152,7 +152,7 @@ public: using ChangesetTags = std::map; /// Tries to upload all local changes to OSM server in a separate thread. /// @param[in] tags should provide additional information about client to use in changeset. - void UploadChanges(std::string const & key, std::string const & secret, ChangesetTags tags, + void UploadChanges(std::string const & secret, ChangesetTags tags, FinishUploadCallback callBack = FinishUploadCallback()); // TODO(mgsergio): Test new types from new config but with old classificator (where these types are absent). // Editor should silently ignore all types in config which are unknown to him. diff --git a/qt/mainwindow.cpp b/qt/mainwindow.cpp index 75b0e8fefb..6b7123217b 100644 --- a/qt/mainwindow.cpp +++ b/qt/mainwindow.cpp @@ -90,8 +90,7 @@ template T * CreateBlackControl(QString const & name) } // namespace // Defined in osm_auth_dialog.cpp. -extern char const * kTokenKeySetting; -extern char const * kTokenSecretSetting; +extern char const * kOauthTokenSetting; MainWindow::MainWindow(Framework & framework, std::unique_ptr && screenshotParams, @@ -639,9 +638,8 @@ void MainWindow::OnLoginMenuItem() void MainWindow::OnUploadEditsMenuItem() { - std::string key, secret; - if (!settings::Get(kTokenKeySetting, key) || key.empty() || - !settings::Get(kTokenSecretSetting, secret) || secret.empty()) + std::string token; + if (!settings::Get(kOauthTokenSetting, token) || token.empty()) { OnLoginMenuItem(); } @@ -649,7 +647,7 @@ void MainWindow::OnUploadEditsMenuItem() { auto & editor = osm::Editor::Instance(); if (editor.HaveMapEditsOrNotesToUpload()) - editor.UploadChanges(key, secret, {{"created_by", "Organic Maps " OMIM_OS_NAME}}); + editor.UploadChanges(token, {{"created_by", "Organic Maps " OMIM_OS_NAME}}); } } diff --git a/qt/osm_auth_dialog.cpp b/qt/osm_auth_dialog.cpp index 0fdb1424e1..e8894b3f1d 100644 --- a/qt/osm_auth_dialog.cpp +++ b/qt/osm_auth_dialog.cpp @@ -20,12 +20,12 @@ namespace qt char const * kTokenKeySetting = "OsmTokenKey"; char const * kTokenSecretSetting = "OsmTokenSecret"; char const * kLoginDialogTitle = "OpenStreetMap Login"; +char const * kOauthTokenSetting = "OsmOauthToken"; OsmAuthDialog::OsmAuthDialog(QWidget * parent) { - std::string key, secret; - bool const isLoginDialog = !settings::Get(kTokenKeySetting, key) || key.empty() || - !settings::Get(kTokenSecretSetting, secret) || secret.empty(); + std::string token; + bool const isLoginDialog = !settings::Get(kOauthTokenSetting, token) || token.empty(); QVBoxLayout * vLayout = new QVBoxLayout(parent); @@ -104,9 +104,8 @@ void OsmAuthDialog::OnAction() { if (auth.AuthorizePassword(login, password)) { - auto const token = auth.GetKeySecret(); - settings::Set(kTokenKeySetting, token.first); - settings::Set(kTokenSecretSetting, token.second); + auto const token = auth.GetAuthToken(); + settings::Set(kOauthTokenSetting, token); SwitchToLogout(this); } @@ -124,8 +123,7 @@ void OsmAuthDialog::OnAction() } else { - settings::Set(kTokenKeySetting, std::string()); - settings::Set(kTokenSecretSetting, std::string()); + settings::Set(kOauthTokenSetting, std::string()); SwitchToLogin(this); }