mirror of
https://github.com/cypherstack/stack_wallet.git
synced 2025-01-07 03:09:31 +00:00
use tor-package-exported SOCKSSocket
This commit is contained in:
parent
0d0d309da7
commit
5bd399a625
4 changed files with 80 additions and 423 deletions
|
@ -15,9 +15,9 @@ import 'dart:io';
|
|||
import 'package:flutter/foundation.dart';
|
||||
import 'package:mutex/mutex.dart';
|
||||
import 'package:stackwallet/exceptions/json_rpc/json_rpc_exception.dart';
|
||||
import 'package:stackwallet/networking/socks_socket.dart';
|
||||
import 'package:stackwallet/utilities/logger.dart';
|
||||
import 'package:stackwallet/utilities/prefs.dart';
|
||||
import 'package:tor_ffi_plugin/socks_socket.dart';
|
||||
|
||||
// Json RPC class to handle connecting to electrumx servers
|
||||
class JsonRPC {
|
||||
|
|
|
@ -1,343 +0,0 @@
|
|||
import 'dart:async';
|
||||
import 'dart:convert';
|
||||
import 'dart:io';
|
||||
|
||||
/// A SOCKS5 socket.
|
||||
///
|
||||
/// This class is a wrapper around the Socket class that implements the
|
||||
/// SOCKS5 protocol. It supports SSL and non-SSL connections.
|
||||
///
|
||||
/// TODO move into / use via cypherstack/tor or Foundation-Devices/tor in order
|
||||
/// to stay in sync with changes in the tor package.
|
||||
///
|
||||
/// Properties:
|
||||
/// - [proxyHost]: The host of the SOCKS5 proxy server.
|
||||
/// - [proxyPort]: The port of the SOCKS5 proxy server.
|
||||
/// - [_socksSocket]: The underlying Socket that connects to the SOCKS5 proxy
|
||||
/// server.
|
||||
/// - [_responseController]: A StreamController that listens to the
|
||||
/// [_socksSocket] and broadcasts the response.
|
||||
///
|
||||
/// Methods:
|
||||
/// - connect: Connects to the SOCKS5 proxy server.
|
||||
/// - connectTo: Connects to the specified [domain] and [port] through the
|
||||
/// SOCKS5 proxy server.
|
||||
/// - write: Converts [object] to a String by invoking [Object.toString] and
|
||||
/// sends the encoding of the result to the socket.
|
||||
/// - sendServerFeaturesCommand: Sends the server.features command to the
|
||||
/// proxy server.
|
||||
/// - close: Closes the connection to the Tor proxy.
|
||||
///
|
||||
/// Usage:
|
||||
/// ```dart
|
||||
/// // Instantiate a socks socket at localhost and on the port selected by the
|
||||
/// // tor service.
|
||||
/// var socksSocket = await SOCKSSocket.create(
|
||||
/// proxyHost: InternetAddress.loopbackIPv4.address,
|
||||
/// proxyPort: tor.port,
|
||||
/// // sslEnabled: true, // For SSL connections.
|
||||
/// );
|
||||
///
|
||||
/// // Connect to the socks instantiated above.
|
||||
/// await socksSocket.connect();
|
||||
///
|
||||
/// // Connect to bitcoincash.stackwallet.com on port 50001 via socks socket.
|
||||
/// await socksSocket.connectTo(
|
||||
/// 'bitcoincash.stackwallet.com', 50001);
|
||||
///
|
||||
/// // Send a server features command to the connected socket, see method for
|
||||
/// // more specific usage example..
|
||||
/// await socksSocket.sendServerFeaturesCommand();
|
||||
/// await socksSocket.close();
|
||||
/// ```
|
||||
///
|
||||
/// See also:
|
||||
/// - SOCKS5 protocol(https://www.ietf.org/rfc/rfc1928.txt)
|
||||
class SOCKSSocket {
|
||||
/// The host of the SOCKS5 proxy server.
|
||||
final String proxyHost;
|
||||
|
||||
/// The port of the SOCKS5 proxy server.
|
||||
final int proxyPort;
|
||||
|
||||
/// The underlying Socket that connects to the SOCKS5 proxy server.
|
||||
late final Socket _socksSocket;
|
||||
|
||||
/// Getter for the underlying Socket that connects to the SOCKS5 proxy server.
|
||||
Socket get socket => sslEnabled ? _secureSocksSocket : _socksSocket;
|
||||
|
||||
/// A wrapper around the _socksSocket that enables SSL connections.
|
||||
late final Socket _secureSocksSocket;
|
||||
|
||||
/// A StreamController that listens to the _socksSocket and broadcasts.
|
||||
final StreamController<List<int>> _responseController =
|
||||
StreamController.broadcast();
|
||||
|
||||
/// A StreamController that listens to the _secureSocksSocket and broadcasts.
|
||||
final StreamController<List<int>> _secureResponseController =
|
||||
StreamController.broadcast();
|
||||
|
||||
/// Getter for the StreamController that listens to the _socksSocket and
|
||||
/// broadcasts, or the _secureSocksSocket and broadcasts if SSL is enabled.
|
||||
StreamController<List<int>> get responseController =>
|
||||
sslEnabled ? _secureResponseController : _responseController;
|
||||
|
||||
/// A StreamSubscription that listens to the _socksSocket or the
|
||||
/// _secureSocksSocket if SSL is enabled.
|
||||
StreamSubscription<List<int>>? _subscription;
|
||||
|
||||
/// Getter for the StreamSubscription that listens to the _socksSocket or the
|
||||
/// _secureSocksSocket if SSL is enabled.
|
||||
StreamSubscription<List<int>>? get subscription => _subscription;
|
||||
|
||||
/// Is SSL enabled?
|
||||
final bool sslEnabled;
|
||||
|
||||
/// Private constructor.
|
||||
SOCKSSocket._(this.proxyHost, this.proxyPort, this.sslEnabled);
|
||||
|
||||
/// Creates a SOCKS5 socket to the specified [proxyHost] and [proxyPort].
|
||||
///
|
||||
/// This method is a factory constructor that returns a Future that resolves
|
||||
/// to a SOCKSSocket instance.
|
||||
///
|
||||
/// Parameters:
|
||||
/// - [proxyHost]: The host of the SOCKS5 proxy server.
|
||||
/// - [proxyPort]: The port of the SOCKS5 proxy server.
|
||||
///
|
||||
/// Returns:
|
||||
/// A Future that resolves to a SOCKSSocket instance.
|
||||
static Future<SOCKSSocket> create(
|
||||
{required String proxyHost,
|
||||
required int proxyPort,
|
||||
bool sslEnabled = false}) async {
|
||||
// Create a SOCKS socket instance.
|
||||
var instance = SOCKSSocket._(proxyHost, proxyPort, sslEnabled);
|
||||
|
||||
// Initialize the SOCKS socket.
|
||||
await instance._init();
|
||||
|
||||
// Return the SOCKS socket instance.
|
||||
return instance;
|
||||
}
|
||||
|
||||
/// Constructor.
|
||||
SOCKSSocket(
|
||||
{required this.proxyHost,
|
||||
required this.proxyPort,
|
||||
required this.sslEnabled}) {
|
||||
_init();
|
||||
}
|
||||
|
||||
/// Initializes the SOCKS socket.
|
||||
///
|
||||
/// This method is a private method that is called by the constructor.
|
||||
///
|
||||
/// Returns:
|
||||
/// A Future that resolves to void.
|
||||
Future<void> _init() async {
|
||||
// Connect to the SOCKS proxy server.
|
||||
_socksSocket = await Socket.connect(
|
||||
proxyHost,
|
||||
proxyPort,
|
||||
);
|
||||
|
||||
// Listen to the socket.
|
||||
_subscription = _socksSocket.listen(
|
||||
(data) {
|
||||
// Add the data to the response controller.
|
||||
_responseController.add(data);
|
||||
},
|
||||
onError: (e) {
|
||||
// Handle errors.
|
||||
if (e is Object) {
|
||||
_responseController.addError(e);
|
||||
}
|
||||
|
||||
// If the error is not an object, send the error as a string.
|
||||
_responseController.addError("$e");
|
||||
// TODO make sure sending error as string is acceptable.
|
||||
},
|
||||
onDone: () {
|
||||
// Close the response controller when the socket is closed.
|
||||
_responseController.close();
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
/// Connects to the SOCKS socket.
|
||||
///
|
||||
/// Returns:
|
||||
/// A Future that resolves to void.
|
||||
Future<void> connect() async {
|
||||
// Greeting and method selection.
|
||||
_socksSocket.add([0x05, 0x01, 0x00]);
|
||||
|
||||
// Wait for server response.
|
||||
var response = await _responseController.stream.first;
|
||||
|
||||
// Check if the connection was successful.
|
||||
if (response[1] != 0x00) {
|
||||
throw Exception(
|
||||
'socks_socket.connect(): Failed to connect to SOCKS5 proxy.');
|
||||
}
|
||||
}
|
||||
|
||||
/// Connects to the specified [domain] and [port] through the SOCKS socket.
|
||||
///
|
||||
/// Parameters:
|
||||
/// - [domain]: The domain to connect to.
|
||||
/// - [port]: The port to connect to.
|
||||
///
|
||||
/// Returns:
|
||||
/// A Future that resolves to void.
|
||||
Future<void> connectTo(String domain, int port) async {
|
||||
// Connect command.
|
||||
var request = [
|
||||
0x05, // SOCKS version.
|
||||
0x01, // Connect command.
|
||||
0x00, // Reserved.
|
||||
0x03, // Domain name.
|
||||
domain.length,
|
||||
...domain.codeUnits,
|
||||
(port >> 8) & 0xFF,
|
||||
port & 0xFF
|
||||
];
|
||||
|
||||
// Send the connect command to the SOCKS proxy server.
|
||||
_socksSocket.add(request);
|
||||
|
||||
// Wait for server response.
|
||||
var response = await _responseController.stream.first;
|
||||
|
||||
// Check if the connection was successful.
|
||||
if (response[1] != 0x00) {
|
||||
throw Exception(
|
||||
'socks_socket.connectTo(): Failed to connect to target through SOCKS5 proxy.');
|
||||
}
|
||||
|
||||
// Upgrade to SSL if needed
|
||||
if (sslEnabled) {
|
||||
// Upgrade to SSL.
|
||||
_secureSocksSocket = await SecureSocket.secure(
|
||||
_socksSocket,
|
||||
host: domain,
|
||||
// onBadCertificate: (_) => true, // Uncomment this to bypass certificate validation (NOT recommended for production).
|
||||
);
|
||||
|
||||
// Listen to the secure socket.
|
||||
_subscription = _secureSocksSocket.listen(
|
||||
(data) {
|
||||
// Add the data to the response controller.
|
||||
_secureResponseController.add(data);
|
||||
},
|
||||
onError: (e) {
|
||||
// Handle errors.
|
||||
if (e is Object) {
|
||||
_secureResponseController.addError(e);
|
||||
}
|
||||
|
||||
// If the error is not an object, send the error as a string.
|
||||
_secureResponseController.addError("$e");
|
||||
// TODO make sure sending error as string is acceptable.
|
||||
},
|
||||
onDone: () {
|
||||
// Close the response controller when the socket is closed.
|
||||
_secureResponseController.close();
|
||||
},
|
||||
);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/// Converts [object] to a String by invoking [Object.toString] and
|
||||
/// sends the encoding of the result to the socket.
|
||||
///
|
||||
/// Parameters:
|
||||
/// - [object]: The object to write to the socket.
|
||||
///
|
||||
/// Returns:
|
||||
/// A Future that resolves to void.
|
||||
void write(Object? object) {
|
||||
// Don't write null.
|
||||
if (object == null) return;
|
||||
|
||||
// Write the data to the socket.
|
||||
List<int> data = utf8.encode(object.toString());
|
||||
if (sslEnabled) {
|
||||
_secureSocksSocket.add(data);
|
||||
} else {
|
||||
_socksSocket.add(data);
|
||||
}
|
||||
}
|
||||
|
||||
/// Closes the connection to the Tor proxy.
|
||||
///
|
||||
/// Returns:
|
||||
/// A Future that resolves to void.
|
||||
Future<void> close() async {
|
||||
// Ensure all data is sent before closing.
|
||||
//
|
||||
// TODO test this.
|
||||
if (sslEnabled) {
|
||||
await _socksSocket.flush();
|
||||
await _secureResponseController.close();
|
||||
}
|
||||
await _socksSocket.flush();
|
||||
await _responseController.close();
|
||||
return await _socksSocket.close();
|
||||
}
|
||||
|
||||
StreamSubscription<List<int>> listen(
|
||||
void Function(List<int> data)? onData, {
|
||||
Function? onError,
|
||||
void Function()? onDone,
|
||||
bool? cancelOnError,
|
||||
}) {
|
||||
return sslEnabled
|
||||
? _secureResponseController.stream.listen(
|
||||
onData,
|
||||
onError: onError,
|
||||
onDone: onDone,
|
||||
cancelOnError: cancelOnError,
|
||||
)
|
||||
: _responseController.stream.listen(
|
||||
onData,
|
||||
onError: onError,
|
||||
onDone: onDone,
|
||||
cancelOnError: cancelOnError,
|
||||
);
|
||||
}
|
||||
|
||||
/// Sends the server.features command to the proxy server.
|
||||
///
|
||||
/// This demos how to send the server.features command. Use as an example
|
||||
/// for sending other commands.
|
||||
///
|
||||
/// Returns:
|
||||
/// A Future that resolves to void.
|
||||
Future<void> sendServerFeaturesCommand() async {
|
||||
// The server.features command.
|
||||
const String command =
|
||||
'{"jsonrpc":"2.0","id":"0","method":"server.features","params":[]}';
|
||||
|
||||
if (!sslEnabled) {
|
||||
// Send the command to the proxy server.
|
||||
_socksSocket.writeln(command);
|
||||
|
||||
// Wait for the response from the proxy server.
|
||||
var responseData = await _responseController.stream.first;
|
||||
print("responseData: ${utf8.decode(responseData)}");
|
||||
} else {
|
||||
// Send the command to the proxy server.
|
||||
_secureSocksSocket.writeln(command);
|
||||
|
||||
// Wait for the response from the proxy server.
|
||||
var responseData = await _secureResponseController.stream.first;
|
||||
print("secure responseData: ${utf8.decode(responseData)}");
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
156
pubspec.lock
156
pubspec.lock
|
@ -37,10 +37,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: archive
|
||||
sha256: "0c8368c9b3f0abbc193b9d6133649a614204b528982bebc7026372d61677ce3a"
|
||||
sha256: e0902a06f0e00414e4e3438a084580161279f137aeb862274710f29ec10cf01e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.3.7"
|
||||
version: "3.3.9"
|
||||
args:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -53,10 +53,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: asn1lib
|
||||
sha256: b74e3842a52c61f8819a1ec8444b4de5419b41a7465e69d4aa681445377398b0
|
||||
sha256: "21afe4333076c02877d14f4a89df111e658a6d466cbfc802eb705eb91bd5adfd"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.4.1"
|
||||
version: "1.5.0"
|
||||
async:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -178,10 +178,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: build_resolvers
|
||||
sha256: "6c4dd11d05d056e76320b828a1db0fc01ccd376922526f8e9d6c796a5adbac20"
|
||||
sha256: d912852cce27c9e80a93603db721c267716894462e7033165178b91138587972
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.2.1"
|
||||
version: "2.3.2"
|
||||
build_runner:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
|
@ -210,10 +210,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: built_value
|
||||
sha256: "598a2a682e2a7a90f08ba39c0aaa9374c5112340f0a2e275f61b59389543d166"
|
||||
sha256: ff627b645b28fb8bdb69e645f910c2458fd6b65f6585c3a53e0626024897dedf
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.6.1"
|
||||
version: "8.6.2"
|
||||
characters:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -250,10 +250,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: code_builder
|
||||
sha256: "4ad01d6e56db961d29661561effde45e519939fdaeb46c351275b182eac70189"
|
||||
sha256: "315a598c7fbe77f22de1c9da7cfd6fd21816312f16ffa124453b4fc679e540f1"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.5.0"
|
||||
version: "4.6.0"
|
||||
collection:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -266,10 +266,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: connectivity_plus
|
||||
sha256: "8599ae9edca5ff96163fca3e36f8e481ea917d1e71cdad912c084b5579913f34"
|
||||
sha256: "77a180d6938f78ca7d2382d2240eb626c0f6a735d0bfdce227d8ffb80f95c48b"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.1"
|
||||
version: "4.0.2"
|
||||
connectivity_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -298,10 +298,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: cross_file
|
||||
sha256: "0b0036e8cccbfbe0555fd83c1d31a6f30b77a96b598b35a5d36dd41f718695e9"
|
||||
sha256: fd832b5384d0d6da4f6df60b854d33accaaeb63aa9e10e736a87381f08dee2cb
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.3.3+4"
|
||||
version: "0.3.3+5"
|
||||
crypto:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -390,10 +390,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: dart_style
|
||||
sha256: "1efa911ca7086affd35f463ca2fc1799584fb6aa89883cf0af8e3664d6a02d55"
|
||||
sha256: abd7625e16f51f554ea244d090292945ec4d4be7bfbaf2ec8cccea568919d334
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.2"
|
||||
version: "2.3.3"
|
||||
dartx:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -430,18 +430,18 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: desktop_drop
|
||||
sha256: "4ca4d960f4b11c032e9adfd2a0a8ac615bc3fddb4cbe73dcf840dd8077582186"
|
||||
sha256: ebba9c9cb0b54385998a977d741cc06fd8324878c08d5a36e9da61cd56b04cc6
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "0.4.1"
|
||||
version: "0.4.3"
|
||||
device_info_plus:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
name: device_info_plus
|
||||
sha256: "2c35b6d1682b028e42d07b3aee4b98fa62996c10bc12cb651ec856a80d6a761b"
|
||||
sha256: "86add5ef97215562d2e090535b0a16f197902b10c369c558a100e74ea06e8659"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "9.0.2"
|
||||
version: "9.0.3"
|
||||
device_info_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -470,10 +470,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: dropdown_button2
|
||||
sha256: "83c54a5022f898d63e3abe21240b64b937e676103207287e6705d3f9bb04d654"
|
||||
sha256: b0fe8d49a030315e9eef6c7ac84ca964250155a6224d491c1365061bc974a9e1
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.6"
|
||||
version: "2.3.9"
|
||||
eip1559:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -502,10 +502,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: encrypt
|
||||
sha256: "4fd4e4fdc21b9d7d4141823e1e6515cd94e7b8d84749504c232999fba25d9bbb"
|
||||
sha256: "62d9aa4670cc2a8798bab89b39fc71b6dfbacf615de6cf5001fb39f7e4a996a2"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.1"
|
||||
version: "5.0.3"
|
||||
equatable:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -623,10 +623,10 @@ packages:
|
|||
dependency: "direct dev"
|
||||
description:
|
||||
name: flutter_lints
|
||||
sha256: "2118df84ef0c3ca93f96123a616ae8540879991b8b57af2f81b76a7ada49b2a4"
|
||||
sha256: a25a15ebbdfc33ab1cd26c63a6ee519df92338a9c10f122adda92938253bef04
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.2"
|
||||
version: "2.0.3"
|
||||
flutter_local_notifications:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -663,18 +663,18 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_native_splash
|
||||
sha256: ba45d8cfbd778478a74696b012f33ffb6b1760c9bc531b21e2964444a4870dae
|
||||
sha256: ecff62b3b893f2f665de7e4ad3de89f738941fcfcaaba8ee601e749efafa4698
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.3.1"
|
||||
version: "2.3.2"
|
||||
flutter_plugin_android_lifecycle:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_plugin_android_lifecycle
|
||||
sha256: "950e77c2bbe1692bc0874fc7fb491b96a4dc340457f4ea1641443d0a6c1ea360"
|
||||
sha256: f185ac890306b5779ecbd611f52502d8d4d63d27703ef73161ca0407e815f02c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.15"
|
||||
version: "2.0.16"
|
||||
flutter_riverpod:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -695,50 +695,50 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: flutter_secure_storage
|
||||
sha256: "98352186ee7ad3639ccc77ad7924b773ff6883076ab952437d20f18a61f0a7c5"
|
||||
sha256: "22dbf16f23a4bcf9d35e51be1c84ad5bb6f627750565edd70dab70f3ff5fff8f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "8.0.0"
|
||||
version: "8.1.0"
|
||||
flutter_secure_storage_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_secure_storage_linux
|
||||
sha256: "0912ae29a572230ad52d8a4697e5518d7f0f429052fd51df7e5a7952c7efe2a3"
|
||||
sha256: "3d5032e314774ee0e1a7d0a9f5e2793486f0dff2dd9ef5a23f4e3fb2a0ae6a9e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.3"
|
||||
version: "1.2.0"
|
||||
flutter_secure_storage_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_secure_storage_macos
|
||||
sha256: "083add01847fc1c80a07a08e1ed6927e9acd9618a35e330239d4422cd2a58c50"
|
||||
sha256: bd33935b4b628abd0b86c8ca20655c5b36275c3a3f5194769a7b3f37c905369c
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.0"
|
||||
version: "3.0.1"
|
||||
flutter_secure_storage_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_secure_storage_platform_interface
|
||||
sha256: b3773190e385a3c8a382007893d678ae95462b3c2279e987b55d140d3b0cb81b
|
||||
sha256: "0d4d3a5dd4db28c96ae414d7ba3b8422fd735a8255642774803b2532c9a61d7e"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.0.1"
|
||||
version: "1.0.2"
|
||||
flutter_secure_storage_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_secure_storage_web
|
||||
sha256: "42938e70d4b872e856e678c423cc0e9065d7d294f45bc41fc1981a4eb4beaffe"
|
||||
sha256: "30f84f102df9dcdaa2241866a958c2ec976902ebdaa8883fbfe525f1f2f3cf20"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.1.1"
|
||||
version: "1.1.2"
|
||||
flutter_secure_storage_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: flutter_secure_storage_windows
|
||||
sha256: fc2910ec9b28d60598216c29ea763b3a96c401f0ce1d13cdf69ccb0e5c93c3ee
|
||||
sha256: "38f9501c7cb6f38961ef0e1eacacee2b2d4715c63cc83fe56449c4d3d0b47255"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
version: "2.1.1"
|
||||
flutter_svg:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -822,10 +822,10 @@ packages:
|
|||
dependency: "direct dev"
|
||||
description:
|
||||
name: hive_generator
|
||||
sha256: "65998cc4d2cd9680a3d9709d893d2f6bb15e6c1f92626c3f1fa650b4b3281521"
|
||||
sha256: "06cb8f58ace74de61f63500564931f9505368f45f98958bd7a6c35ba24159db4"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.0"
|
||||
version: "2.0.1"
|
||||
hive_test:
|
||||
dependency: "direct dev"
|
||||
description:
|
||||
|
@ -1002,10 +1002,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: lottie
|
||||
sha256: "0793a5866062e5cc8a8b24892fa94c3095953ea914a7fdf790f550dd7537fe60"
|
||||
sha256: b8bdd54b488c54068c57d41ae85d02808da09e2bee8b8dd1f59f441e7efa60cd
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.5.0"
|
||||
version: "2.6.0"
|
||||
matcher:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1122,10 +1122,10 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: package_info_plus
|
||||
sha256: ceb027f6bc6a60674a233b4a90a7658af1aebdea833da0b5b53c1e9821a78c7b
|
||||
sha256: "6ff267fcd9d48cb61c8df74a82680e8b82e940231bb5f68356672fde0397334a"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "4.0.2"
|
||||
version: "4.1.0"
|
||||
package_info_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1210,10 +1210,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: permission_handler_android
|
||||
sha256: "6901d50f4d4b9a27e1749dbd4adbf06aa00d90a21a2db563405d5ce27ee120ac"
|
||||
sha256: f23cfe9af0d49c6b9fd8a8b09f7b3301ca7e346204939b5afef4404d36d2608f
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "11.0.0"
|
||||
version: "11.0.1"
|
||||
permission_handler_apple:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1266,10 +1266,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: plugin_platform_interface
|
||||
sha256: "43798d895c929056255600343db8f049921cbec94d31ec87f1dc5c16c01935dd"
|
||||
sha256: da3fdfeccc4d4ff2da8f8c556704c08f912542c5fb3cf2233ed75372384a034d
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.5"
|
||||
version: "2.1.6"
|
||||
pointycastle:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1394,18 +1394,18 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: share_plus
|
||||
sha256: ed3fcea4f789ed95913328e629c0c53e69e80e08b6c24542f1b3576046c614e8
|
||||
sha256: "6cec740fa0943a826951223e76218df002804adb588235a8910dc3d6b0654e11"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "7.0.2"
|
||||
version: "7.1.0"
|
||||
share_plus_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: share_plus_platform_interface
|
||||
sha256: "0c6e61471bd71b04a138b8b588fa388e66d8b005e6f2deda63371c5c505a0981"
|
||||
sha256: "357412af4178d8e11d14f41723f80f12caea54cf0d5cd29af9dcdab85d58aea7"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.2.1"
|
||||
version: "3.3.0"
|
||||
shelf:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
@ -1648,8 +1648,8 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
path: "."
|
||||
ref: "8a26a160bdc4dcac2ba5a0350a151a345d1dead9"
|
||||
resolved-ref: "8a26a160bdc4dcac2ba5a0350a151a345d1dead9"
|
||||
ref: "072bb51dc7fbaf187a1d1cfab9b46b53c2c3089f"
|
||||
resolved-ref: "072bb51dc7fbaf187a1d1cfab9b46b53c2c3089f"
|
||||
url: "https://github.com/cypherstack/tor.git"
|
||||
source: git
|
||||
version: "0.0.1"
|
||||
|
@ -1689,66 +1689,66 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
name: url_launcher
|
||||
sha256: "781bd58a1eb16069412365c98597726cd8810ae27435f04b3b4d3a470bacd61e"
|
||||
sha256: "47e208a6711459d813ba18af120d9663c20bdf6985d6ad39fe165d2538378d27"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.1.12"
|
||||
version: "6.1.14"
|
||||
url_launcher_android:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_android
|
||||
sha256: "78cb6dea3e93148615109e58e42c35d1ffbf5ef66c44add673d0ab75f12ff3af"
|
||||
sha256: b04af59516ab45762b2ca6da40fa830d72d0f6045cd97744450b73493fa76330
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.0.37"
|
||||
version: "6.1.0"
|
||||
url_launcher_ios:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_ios
|
||||
sha256: "9af7ea73259886b92199f9e42c116072f05ff9bea2dcb339ab935dfc957392c2"
|
||||
sha256: "7c65021d5dee51813d652357bc65b8dd4a6177082a9966bc8ba6ee477baa795f"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "6.1.4"
|
||||
version: "6.1.5"
|
||||
url_launcher_linux:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_linux
|
||||
sha256: "207f4ddda99b95b4d4868320a352d374b0b7e05eefad95a4a26f57da413443f5"
|
||||
sha256: b651aad005e0cb06a01dbd84b428a301916dc75f0e7ea6165f80057fee2d8e8e
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.5"
|
||||
version: "3.0.6"
|
||||
url_launcher_macos:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_macos
|
||||
sha256: "1c4fdc0bfea61a70792ce97157e5cc17260f61abbe4f39354513f39ec6fd73b1"
|
||||
sha256: b55486791f666e62e0e8ff825e58a023fd6b1f71c49926483f1128d3bbd8fe88
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.6"
|
||||
version: "3.0.7"
|
||||
url_launcher_platform_interface:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_platform_interface
|
||||
sha256: bfdfa402f1f3298637d71ca8ecfe840b4696698213d5346e9d12d4ab647ee2ea
|
||||
sha256: "95465b39f83bfe95fcb9d174829d6476216f2d548b79c38ab2506e0458787618"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.1.3"
|
||||
version: "2.1.5"
|
||||
url_launcher_web:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_web
|
||||
sha256: cc26720eefe98c1b71d85f9dc7ef0cada5132617046369d9dc296b3ecaa5cbb4
|
||||
sha256: ba140138558fcc3eead51a1c42e92a9fb074a1b1149ed3c73e66035b2ccd94f2
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "2.0.18"
|
||||
version: "2.0.19"
|
||||
url_launcher_windows:
|
||||
dependency: transitive
|
||||
description:
|
||||
name: url_launcher_windows
|
||||
sha256: "7967065dd2b5fccc18c653b97958fdf839c5478c28e767c61ee879f4e7882422"
|
||||
sha256: "95fef3129dc7cfaba2bc3d5ba2e16063bb561fc6d78e63eee16162bc70029069"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "3.0.7"
|
||||
version: "3.0.8"
|
||||
uuid:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1882,10 +1882,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: webkit_inspection_protocol
|
||||
sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d"
|
||||
sha256: "87d3f2333bb240704cd3f1c6b5b7acd8a10e7f0bc28c28dcf14e782014f4a572"
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "1.2.0"
|
||||
version: "1.2.1"
|
||||
websocket_universal:
|
||||
dependency: "direct main"
|
||||
description:
|
||||
|
@ -1898,10 +1898,10 @@ packages:
|
|||
dependency: transitive
|
||||
description:
|
||||
name: win32
|
||||
sha256: dfdf0136e0aa7a1b474ea133e67cb0154a0acd2599c4f3ada3b49d38d38793ee
|
||||
sha256: c97defd418eef4ec88c0d1652cdce84b9f7b63dd7198e266d06ac1710d527067
|
||||
url: "https://pub.dev"
|
||||
source: hosted
|
||||
version: "5.0.5"
|
||||
version: "5.0.8"
|
||||
win32_registry:
|
||||
dependency: transitive
|
||||
description:
|
||||
|
|
|
@ -60,7 +60,7 @@ dependencies:
|
|||
tor_ffi_plugin:
|
||||
git:
|
||||
url: https://github.com/cypherstack/tor.git
|
||||
ref: 8a26a160bdc4dcac2ba5a0350a151a345d1dead9
|
||||
ref: 072bb51dc7fbaf187a1d1cfab9b46b53c2c3089f
|
||||
|
||||
# Utility plugins
|
||||
http: ^0.13.0
|
||||
|
|
Loading…
Reference in a new issue