Merge pull request #844 from cypherstack/tor

Tor patches and warning dialog for non-Tor coins
This commit is contained in:
julian-CStack 2024-05-03 14:13:34 -06:00 committed by GitHub
commit 6537af5a68
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 75 additions and 55 deletions

View file

@ -8,8 +8,12 @@
* *
*/ */
import 'dart:typed_data';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:stackwallet/widgets/loading_indicator.dart'; import 'package:stackwallet/networking/http.dart';
import 'package:stackwallet/services/tor_service.dart';
import 'package:stackwallet/utilities/prefs.dart';
class PayNymBot extends StatelessWidget { class PayNymBot extends StatelessWidget {
const PayNymBot({ const PayNymBot({
@ -28,16 +32,37 @@ class PayNymBot extends StatelessWidget {
child: SizedBox( child: SizedBox(
width: size, width: size,
height: size, height: size,
child: Image.network( child: FutureBuilder<Uint8List>(
"https://paynym.is/$paymentCodeString/avatar", future: _fetchImage(),
loadingBuilder: (context, child, loadingProgress) => builder: (context, snapshot) {
loadingProgress == null if (snapshot.hasData) {
? child return Image.memory(snapshot.data!);
: const Center( } else if (snapshot.hasError) {
child: LoadingIndicator(), return const Center(child: Icon(Icons.error));
), } else {
return const Center(); // TODO [prio=low]: Make better loading indicator.
}
},
), ),
), ),
); );
} }
Future<Uint8List> _fetchImage() async {
final HTTP client = HTTP();
final Uri uri = Uri.parse("https://paynym.is/$paymentCodeString/avatar");
final response = await client.get(
url: uri,
proxyInfo: Prefs.instance.useTor
? TorService.sharedInstance.getProxyInfo()
: null,
);
if (response.code == 200) {
return Uint8List.fromList(response.bodyBytes);
} else {
throw Exception('Failed to load image');
}
}
} }

View file

@ -39,6 +39,9 @@ class Solana extends Bip39Currency {
@override @override
int get minConfirms => 21; int get minConfirms => 21;
@override
bool get torSupport => true;
@override @override
bool validateAddress(String address) { bool validateAddress(String address) {
return isPointOnEd25519Curve( return isPointOnEd25519Curve(

View file

@ -19,6 +19,9 @@ class Stellar extends Bip39Currency {
@override @override
int get minConfirms => 1; int get minConfirms => 1;
@override
bool get torSupport => true;
@override @override
String get genesisHash => throw UnimplementedError( String get genesisHash => throw UnimplementedError(
"Not used for stellar", "Not used for stellar",

View file

@ -70,6 +70,9 @@ class Tezos extends Bip39Currency {
@override @override
int get minConfirms => 1; int get minConfirms => 1;
@override
bool get torSupport => true;
@override @override
bool validateAddress(String address) { bool validateAddress(String address) {
return RegExp(r"^tz[1-9A-HJ-NP-Za-km-z]{34}$").hasMatch(address); return RegExp(r"^tz[1-9A-HJ-NP-Za-km-z]{34}$").hasMatch(address);

View file

@ -1,7 +1,9 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'package:isar/isar.dart'; import 'package:isar/isar.dart';
import 'package:socks5_proxy/socks.dart';
import 'package:stackwallet/models/balance.dart'; import 'package:stackwallet/models/balance.dart';
import 'package:stackwallet/models/isar/models/blockchain_data/address.dart'; import 'package:stackwallet/models/isar/models/blockchain_data/address.dart';
import 'package:stackwallet/models/isar/models/blockchain_data/transaction.dart'; import 'package:stackwallet/models/isar/models/blockchain_data/transaction.dart';
@ -9,6 +11,7 @@ import 'package:stackwallet/models/isar/models/blockchain_data/v2/input_v2.dart'
import 'package:stackwallet/models/isar/models/blockchain_data/v2/output_v2.dart'; import 'package:stackwallet/models/isar/models/blockchain_data/v2/output_v2.dart';
import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart'; import 'package:stackwallet/models/isar/models/blockchain_data/v2/transaction_v2.dart';
import 'package:stackwallet/models/paymint/fee_object_model.dart'; import 'package:stackwallet/models/paymint/fee_object_model.dart';
import 'package:stackwallet/services/tor_service.dart';
import 'package:stackwallet/utilities/amount/amount.dart'; import 'package:stackwallet/utilities/amount/amount.dart';
import 'package:stackwallet/utilities/enums/fee_rate_type_enum.dart'; import 'package:stackwallet/utilities/enums/fee_rate_type_enum.dart';
import 'package:stackwallet/utilities/logger.dart'; import 'package:stackwallet/utilities/logger.dart';
@ -43,6 +46,7 @@ class StellarWallet extends Bip39Wallet<Stellar> {
// ============== Private ==================================================== // ============== Private ====================================================
stellar.StellarSDK? _stellarSdk; stellar.StellarSDK? _stellarSdk;
HttpClient? _httpClient;
Future<int> _getBaseFee() async { Future<int> _getBaseFee() async {
final fees = await stellarSdk.feeStats.execute(); final fees = await stellarSdk.feeStats.execute();
@ -51,7 +55,21 @@ class StellarWallet extends Bip39Wallet<Stellar> {
void _updateSdk() { void _updateSdk() {
final currentNode = getCurrentNode(); final currentNode = getCurrentNode();
_stellarSdk = stellar.StellarSDK("${currentNode.host}:${currentNode.port}");
// TODO [prio=med]: refactor out and call before requests in case Tor is enabled/disabled, listen to prefs change, or similar.
if (prefs.useTor) {
final ({InternetAddress host, int port}) proxyInfo =
TorService.sharedInstance.getProxyInfo();
_httpClient = HttpClient();
SocksTCPClient.assignToHttpClient(
_httpClient!, [ProxySettings(proxyInfo.host, proxyInfo.port)]);
} else {
_httpClient = null;
}
_stellarSdk = stellar.StellarSDK("${currentNode.host}:${currentNode.port}",
httpClient: _httpClient);
} }
Future<bool> _accountExists(String accountId) async { Future<bool> _accountExists(String accountId) async {

View file

@ -30,7 +30,6 @@ import 'package:stackwallet/wallets/wallet/wallet.dart';
import 'package:stackwallet/wallets/wallet/wallet_mixin_interfaces/cw_based_interface.dart'; import 'package:stackwallet/wallets/wallet/wallet_mixin_interfaces/cw_based_interface.dart';
import 'package:stackwallet/widgets/conditional_parent.dart'; import 'package:stackwallet/widgets/conditional_parent.dart';
import 'package:stackwallet/widgets/desktop/primary_button.dart'; import 'package:stackwallet/widgets/desktop/primary_button.dart';
import 'package:stackwallet/widgets/desktop/secondary_button.dart';
import 'package:stackwallet/widgets/dialogs/basic_dialog.dart'; import 'package:stackwallet/widgets/dialogs/basic_dialog.dart';
import 'package:stackwallet/widgets/rounded_white_container.dart'; import 'package:stackwallet/widgets/rounded_white_container.dart';
import 'package:stackwallet/widgets/wallet_info_row/wallet_info_row.dart'; import 'package:stackwallet/widgets/wallet_info_row/wallet_info_row.dart';
@ -95,37 +94,6 @@ class SimpleWalletCard extends ConsumerWidget {
final wallet = ref.read(pWallets).getWallet(walletId); final wallet = ref.read(pWallets).getWallet(walletId);
// If Tor enabled, show a warning if opening a wallet incompatible with Tor.
if (ref.read(prefsChangeNotifierProvider).useTor) {
if (!wallet.cryptoCurrency.torSupport) {
final shouldContinue = await showDialog<bool>(
context: context,
builder: (context) => BasicDialog(
title: "Warning! Tor not supported.",
message: "Stacky is not compatible with Tor."
"\n\nBy using it, you will leak your IP address. Are you sure you "
"want to continue?",
// A PrimaryButton widget:
leftButton: PrimaryButton(
label: "Cancel",
onPressed: () {
Navigator.of(context).pop(false);
},
),
rightButton: SecondaryButton(
label: "Continue",
onPressed: () {
Navigator.of(context).pop(true);
},
),
)) ??
false;
if (!shouldContinue) {
return;
}
}
}
if (context.mounted) { if (context.mounted) {
final Future<void> loadFuture; final Future<void> loadFuture;
if (wallet is CwBasedInterface) { if (wallet is CwBasedInterface) {

View file

@ -1574,7 +1574,7 @@ packages:
source: hosted source: hosted
version: "1.0.4" version: "1.0.4"
socks_socket: socks_socket:
dependency: "direct main" dependency: transitive
description: description:
path: "." path: "."
ref: master ref: master
@ -1586,8 +1586,8 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
path: "packages/solana" path: "packages/solana"
ref: "0ada1f775c2a2c815de640424270a229f5e91e2f" ref: a83e375678eb22fe544dc125d29bbec0fb833882
resolved-ref: "0ada1f775c2a2c815de640424270a229f5e91e2f" resolved-ref: a83e375678eb22fe544dc125d29bbec0fb833882
url: "https://github.com/cypherstack/espresso-cash-public.git" url: "https://github.com/cypherstack/espresso-cash-public.git"
source: git source: git
version: "0.30.4" version: "0.30.4"
@ -1659,10 +1659,11 @@ packages:
stellar_flutter_sdk: stellar_flutter_sdk:
dependency: "direct main" dependency: "direct main"
description: description:
name: stellar_flutter_sdk path: "."
sha256: "4c55b1b6dfbde7f89bba59a422754280715fa3b5726cff5e7eeaed454d2c4b89" ref: eca1d730e952cf6a6d64502f977cfc03876b75d4
url: "https://pub.dev" resolved-ref: eca1d730e952cf6a6d64502f977cfc03876b75d4
source: hosted url: "https://github.com/cypherstack/stellar_flutter_sdk.git"
source: git
version: "1.5.3" version: "1.5.3"
stream_channel: stream_channel:
dependency: "direct main" dependency: "direct main"

View file

@ -156,11 +156,10 @@ dependencies:
desktop_drop: ^0.4.1 desktop_drop: ^0.4.1
nanodart: ^2.0.0 nanodart: ^2.0.0
basic_utils: ^5.5.4 basic_utils: ^5.5.4
stellar_flutter_sdk: ^1.5.3 stellar_flutter_sdk: # ^1.5.3
socks_socket: git: # TODO [prio=low]: Revert to official package once Tor support is merged upstream.
git: url: https://github.com/cypherstack/stellar_flutter_sdk.git
url: https://github.com/cypherstack/socks_socket.git ref: eca1d730e952cf6a6d64502f977cfc03876b75d4 # tor-backport branch (based on 1.5.3).
ref: master
bip340: ^0.2.0 bip340: ^0.2.0
# tezart: ^2.0.5 # tezart: ^2.0.5
tezart: tezart:
@ -180,7 +179,7 @@ dependencies:
solana: solana:
git: # TODO [prio=low]: Revert to official package once Tor support is merged upstream. git: # TODO [prio=low]: Revert to official package once Tor support is merged upstream.
url: https://github.com/cypherstack/espresso-cash-public.git url: https://github.com/cypherstack/espresso-cash-public.git
ref: 0ada1f775c2a2c815de640424270a229f5e91e2f ref: a83e375678eb22fe544dc125d29bbec0fb833882
path: packages/solana path: packages/solana
dev_dependencies: dev_dependencies: