Files
brave-core/browser/extensions/api/binance_api.cc
T
Mario Sanchez Prada 86ea5a4a01 Use ExtensionFunction::args() instead of accessing its private members
Chromium change:

https://source.chromium.org/chromium/chromium/src/+/a6dba25659702847866ae636d6e334cb4096c4dc

commit a6dba25659702847866ae636d6e334cb4096c4dc
Author: Alex Turner <alexmt@chromium.org>
Date:   Wed Aug 18 01:29:05 2021 +0000

    Move args_ to private in ExtensionFunction

    Following the change in crrev.com/c/3066527, ExtensionFunction now
    provides the protected methods has_args() and args(). We can therefore
    now make args_ private. This requires converting a large number of
    `Params::Create(*args_)` calls to `Params::Create(args())`.

    Bug: 1187062
2021-10-05 16:19:51 -04:00

333 lines
10 KiB
C++

/* Copyright (c) 2020 The Brave Authors. All rights reserved.
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */
#include "brave/browser/extensions/api/binance_api.h"
#include <memory>
#include <string>
#include <utility>
#include <vector>
#include "base/environment.h"
#include "brave/common/extensions/api/binance.h"
#include "brave/common/pref_names.h"
#include "brave/browser/binance/binance_service_factory.h"
#include "brave/components/binance/browser/binance_service.h"
#include "chrome/browser/extensions/api/tabs/tabs_constants.h"
#include "chrome/browser/extensions/extension_tab_util.h"
#include "chrome/browser/profiles/profile.h"
#include "components/prefs/pref_service.h"
#include "extensions/browser/extension_util.h"
#include "extensions/common/constants.h"
namespace {
BinanceService* GetBinanceService(content::BrowserContext* context) {
return BinanceServiceFactory::GetInstance()
->GetForProfile(Profile::FromBrowserContext(context));
}
bool IsBinanceAPIAvailable(content::BrowserContext* context) {
Profile* profile = Profile::FromBrowserContext(context);
return !profile->IsIncognitoProfile() && !profile->IsGuestSession();
}
} // namespace
namespace extensions {
namespace api {
ExtensionFunction::ResponseAction
BinanceGetUserTLDFunction::Run() {
if (!IsBinanceAPIAvailable(browser_context())) {
return RespondNow(Error("Not available in Tor/incognito/guest profile"));
}
auto* service = GetBinanceService(browser_context());
const std::string user_tld = service->GetBinanceTLD();
return RespondNow(OneArgument(base::Value(user_tld)));
}
ExtensionFunction::ResponseAction
BinanceGetClientUrlFunction::Run() {
if (!IsBinanceAPIAvailable(browser_context())) {
return RespondNow(Error("Not available in Tor/incognito/guest profile"));
}
auto* service = GetBinanceService(browser_context());
const std::string client_url = service->GetOAuthClientUrl();
return RespondNow(OneArgument(base::Value(client_url)));
}
ExtensionFunction::ResponseAction
BinanceGetAccessTokenFunction::Run() {
if (!IsBinanceAPIAvailable(browser_context())) {
return RespondNow(Error("Not available in Tor/incognito/guest profile"));
}
auto* service = GetBinanceService(browser_context());
bool token_request = service->GetAccessToken(base::BindOnce(
&BinanceGetAccessTokenFunction::OnCodeResult, this));
if (!token_request) {
return RespondNow(
Error("Could not make request for access tokens"));
}
return RespondLater();
}
void BinanceGetAccessTokenFunction::OnCodeResult(bool success) {
Respond(OneArgument(base::Value(success)));
}
ExtensionFunction::ResponseAction
BinanceGetAccountBalancesFunction::Run() {
if (!IsBinanceAPIAvailable(browser_context())) {
return RespondNow(Error("Not available in Tor/incognito/guest profile"));
}
auto* service = GetBinanceService(browser_context());
bool balance_success = service->GetAccountBalances(
base::BindOnce(
&BinanceGetAccountBalancesFunction::OnGetAccountBalances,
this));
if (!balance_success) {
return RespondNow(Error("Could not send request to get balance"));
}
return RespondLater();
}
void BinanceGetAccountBalancesFunction::OnGetAccountBalances(
const BinanceAccountBalances& balances,
bool success) {
base::DictionaryValue result;
for (const auto& balance : balances) {
auto info = std::make_unique<base::DictionaryValue>();
info->SetString("balance", balance.second[0]);
info->SetString("btcValue", balance.second[1]);
info->SetString("fiatValue", balance.second[2]);
result.SetDictionary(balance.first, std::move(info));
}
Respond(TwoArguments(std::move(result), base::Value(success)));
}
ExtensionFunction::ResponseAction
BinanceGetConvertQuoteFunction::Run() {
if (!IsBinanceAPIAvailable(browser_context())) {
return RespondNow(Error("Not available in Tor/incognito/guest profile"));
}
std::unique_ptr<binance::GetConvertQuote::Params> params(
binance::GetConvertQuote::Params::Create(args()));
EXTENSION_FUNCTION_VALIDATE(params.get());
auto* service = GetBinanceService(browser_context());
bool token_request = service->GetConvertQuote(
params->from, params->to, params->amount,
base::BindOnce(
&BinanceGetConvertQuoteFunction::OnQuoteResult, this));
if (!token_request) {
return RespondNow(
Error("Could not make request for access tokens"));
}
return RespondLater();
}
void BinanceGetConvertQuoteFunction::OnQuoteResult(
const std::string& quote_id, const std::string& quote_price,
const std::string& total_fee, const std::string& total_amount) {
base::Value quote(base::Value::Type::DICTIONARY);
quote.SetStringKey("id", quote_id);
quote.SetStringKey("price", quote_price);
quote.SetStringKey("fee", total_fee);
quote.SetStringKey("amount", total_amount);
Respond(OneArgument(std::move(quote)));
}
ExtensionFunction::ResponseAction
BinanceIsSupportedRegionFunction::Run() {
if (!IsBinanceAPIAvailable(browser_context())) {
return RespondNow(Error("Not available in Tor/incognito/guest profile"));
}
auto* service = GetBinanceService(browser_context());
bool is_supported = service->IsSupportedRegion();
return RespondNow(OneArgument(base::Value(is_supported)));
}
ExtensionFunction::ResponseAction
BinanceGetDepositInfoFunction::Run() {
if (!IsBinanceAPIAvailable(browser_context())) {
return RespondNow(Error("Not available in Tor/incognito/guest profile"));
}
std::unique_ptr<binance::GetDepositInfo::Params> params(
binance::GetDepositInfo::Params::Create(args()));
EXTENSION_FUNCTION_VALIDATE(params.get());
auto* service = GetBinanceService(browser_context());
bool info_request = service->GetDepositInfo(params->symbol,
params->ticker_network,
base::BindOnce(
&BinanceGetDepositInfoFunction::OnGetDepositInfo, this));
if (!info_request) {
return RespondNow(
Error("Could not make request for deposit information."));
}
return RespondLater();
}
void BinanceGetDepositInfoFunction::OnGetDepositInfo(
const std::string& deposit_address,
const std::string& deposit_tag,
bool success) {
Respond(TwoArguments(base::Value(deposit_address), base::Value(deposit_tag)));
}
ExtensionFunction::ResponseAction
BinanceConfirmConvertFunction::Run() {
if (!IsBinanceAPIAvailable(browser_context())) {
return RespondNow(Error("Not available in Tor/incognito/guest profile"));
}
std::unique_ptr<binance::ConfirmConvert::Params> params(
binance::ConfirmConvert::Params::Create(args()));
EXTENSION_FUNCTION_VALIDATE(params.get());
auto* service = GetBinanceService(browser_context());
bool confirm_request = service->ConfirmConvert(params->quote_id,
base::BindOnce(
&BinanceConfirmConvertFunction::OnConfirmConvert, this));
if (!confirm_request) {
return RespondNow(
Error("Could not confirm conversion"));
}
return RespondLater();
}
void BinanceConfirmConvertFunction::OnConfirmConvert(
bool success, const std::string& message) {
Respond(TwoArguments(base::Value(success), base::Value(message)));
}
ExtensionFunction::ResponseAction
BinanceGetConvertAssetsFunction::Run() {
if (!IsBinanceAPIAvailable(browser_context())) {
return RespondNow(Error("Not available in Tor/incognito/guest profile"));
}
auto* service = GetBinanceService(browser_context());
bool asset_request = service->GetConvertAssets(base::BindOnce(
&BinanceGetConvertAssetsFunction::OnGetConvertAssets, this));
if (!asset_request) {
return RespondNow(
Error("Could not retrieve supported convert assets"));
}
return RespondLater();
}
void BinanceGetConvertAssetsFunction::OnGetConvertAssets(
const BinanceConvertAsserts& assets) {
base::Value result(base::Value::Type::DICTIONARY);
for (const auto& asset : assets) {
base::ListValue sub_selectors;
for (const auto& sub : asset.second) {
auto sub_selector = std::make_unique<base::Value>(
base::Value::Type::DICTIONARY);
for (const auto& att : sub) {
sub_selector->SetStringKey(att.first, att.second);
}
sub_selectors.Append(std::move(sub_selector));
}
result.SetKey(asset.first, std::move(sub_selectors));
}
Respond(OneArgument(std::move(result)));
}
ExtensionFunction::ResponseAction
BinanceRevokeTokenFunction::Run() {
if (!IsBinanceAPIAvailable(browser_context())) {
return RespondNow(Error("Not available in Tor/incognito/guest profile"));
}
auto* service = GetBinanceService(browser_context());
bool request = service->RevokeToken(base::BindOnce(
&BinanceRevokeTokenFunction::OnRevokeToken, this));
if (!request) {
return RespondNow(
Error("Could not revoke token"));
}
return RespondLater();
}
void BinanceRevokeTokenFunction::OnRevokeToken(bool success) {
Respond(OneArgument(base::Value(success)));
}
ExtensionFunction::ResponseAction
BinanceGetCoinNetworksFunction::Run() {
if (!IsBinanceAPIAvailable(browser_context())) {
return RespondNow(Error("Not available in Tor/incognito/guest profile"));
}
auto* service = GetBinanceService(browser_context());
bool balance_success = service->GetCoinNetworks(
base::BindOnce(
&BinanceGetCoinNetworksFunction::OnGetCoinNetworks,
this));
if (!balance_success) {
return RespondNow(Error("Could not send request to get coin networks"));
}
return RespondLater();
}
void BinanceGetCoinNetworksFunction::OnGetCoinNetworks(
const BinanceCoinNetworks& networks) {
base::Value coin_networks(base::Value::Type::DICTIONARY);
for (const auto& network : networks) {
coin_networks.SetStringKey(network.first, network.second);
}
Respond(OneArgument(std::move(coin_networks)));
}
ExtensionFunction::ResponseAction BinanceGetLocaleForURLFunction::Run() {
if (!IsBinanceAPIAvailable(browser_context())) {
return RespondNow(Error("Not available in Tor/incognito/guest profile"));
}
auto* service = GetBinanceService(browser_context());
const std::string locale = service->GetLocaleForURL();
return RespondNow(OneArgument(base::Value(locale)));
}
} // namespace api
} // namespace extensions