opt.: disable it on iOS

This commit is contained in:
lollipopkit🏳️‍⚧️
2025-10-25 20:37:14 +08:00
parent b6ab8f1db5
commit 92a4601335
4 changed files with 36 additions and 6 deletions

View File

@@ -33,6 +33,10 @@ abstract final class ProxyCommandExecutor {
required int port, required int port,
required String user, required String user,
}) async { }) async {
if (Platform.isIOS) {
throw ProxyCommandException(message: 'ProxyCommand is not supported on iOS');
}
final finalCommand = config.getFinalCommand(hostname: hostname, port: port, user: user); final finalCommand = config.getFinalCommand(hostname: hostname, port: port, user: user);
Loggers.app.info('Executing proxy command: $finalCommand'); Loggers.app.info('Executing proxy command: $finalCommand');
@@ -99,6 +103,10 @@ abstract final class ProxyCommandExecutor {
/// Validate proxy command configuration /// Validate proxy command configuration
static Future<String?> validateConfig(ProxyCommandConfig config) async { static Future<String?> validateConfig(ProxyCommandConfig config) async {
if (Platform.isIOS) {
return 'ProxyCommand is not supported on iOS';
}
final testCommand = config.getFinalCommand(hostname: 'test.example.com', port: 22, user: 'testuser'); final testCommand = config.getFinalCommand(hostname: 'test.example.com', port: 22, user: 'testuser');
// Check if required placeholders are present // Check if required placeholders are present

View File

@@ -1,5 +1,6 @@
import 'dart:async'; import 'dart:async';
import 'dart:convert'; import 'dart:convert';
import 'dart:io';
import 'package:dartssh2/dartssh2.dart'; import 'package:dartssh2/dartssh2.dart';
import 'package:fl_lib/fl_lib.dart'; import 'package:fl_lib/fl_lib.dart';
@@ -122,24 +123,27 @@ Future<SSHClient> genClient(
// For ProxyCommand and direct connections, get SSHSocket // For ProxyCommand and direct connections, get SSHSocket
SSHSocket? socket; SSHSocket? socket;
try { try {
final proxyCommand = spi.proxyCommand;
// ProxyCommand support - Check for ProxyCommand configuration first // ProxyCommand support - Check for ProxyCommand configuration first
if (spi.proxyCommand != null) { if (proxyCommand != null && !Platform.isIOS) {
try { try {
Loggers.app.info('Connecting via ProxyCommand: ${spi.proxyCommand!.command}'); Loggers.app.info('Connecting via ProxyCommand: ${proxyCommand.command}');
socket = await ProxyCommandExecutor.executeProxyCommand( socket = await ProxyCommandExecutor.executeProxyCommand(
spi.proxyCommand!, proxyCommand,
hostname: spi.ip, hostname: spi.ip,
port: spi.port, port: spi.port,
user: spi.user, user: spi.user,
); );
} catch (e) { } catch (e) {
Loggers.app.warning('ProxyCommand failed', e); Loggers.app.warning('ProxyCommand failed', e);
if (!spi.proxyCommand!.retryOnFailure) { if (!proxyCommand.retryOnFailure) {
rethrow; rethrow;
} }
// If retry is enabled, fall through to direct connection // If retry is enabled, fall through to direct connection
Loggers.app.info('ProxyCommand failed, falling back to direct connection'); Loggers.app.info('ProxyCommand failed, falling back to direct connection');
} }
} else if (proxyCommand != null && Platform.isIOS) {
Loggers.app.info('ProxyCommand configuration is ignored on iOS');
} }
// Direct connection (or fallback) // Direct connection (or fallback)

View File

@@ -267,7 +267,7 @@ extension _Actions on _ServerEditPageState {
// ProxyCommand configuration // ProxyCommand configuration
ProxyCommandConfig? proxyCommand; ProxyCommandConfig? proxyCommand;
if (_proxyCommandEnabled.value) { if (!Platform.isIOS && _proxyCommandEnabled.value) {
final command = _proxyCommandController.text.trim(); final command = _proxyCommandController.text.trim();
if (command.isEmpty) { if (command.isEmpty) {
context.showSnackBar('ProxyCommand is enabled but command is empty'); context.showSnackBar('ProxyCommand is enabled but command is empty');
@@ -292,6 +292,9 @@ extension _Actions on _ServerEditPageState {
requiresExecutable: requiresExecutable, requiresExecutable: requiresExecutable,
executableName: requiresExecutable ? executable : null, executableName: requiresExecutable ? executable : null,
); );
} else if (Platform.isIOS && _proxyCommandEnabled.value) {
context.showSnackBar('ProxyCommand is not supported on iOS');
return;
} }
final spi = Spi( final spi = Spi(
@@ -483,7 +486,7 @@ extension _Utils on _ServerEditPageState {
// Load ProxyCommand configuration // Load ProxyCommand configuration
final proxyCommand = spi.proxyCommand; final proxyCommand = spi.proxyCommand;
if (proxyCommand != null) { if (proxyCommand != null && !Platform.isIOS) {
_proxyCommandEnabled.value = true; _proxyCommandEnabled.value = true;
_proxyCommandController.text = proxyCommand.command; _proxyCommandController.text = proxyCommand.command;
_proxyCommandTimeout.value = proxyCommand.timeout.inSeconds; _proxyCommandTimeout.value = proxyCommand.timeout.inSeconds;
@@ -502,5 +505,12 @@ extension _Utils on _ServerEditPageState {
_proxyCommandTimeout.value = 30; _proxyCommandTimeout.value = 30;
_proxyCommandPreset.value = null; _proxyCommandPreset.value = null;
} }
if (Platform.isIOS) {
_proxyCommandEnabled.value = false;
_proxyCommandController.text = '';
_proxyCommandTimeout.value = 30;
_proxyCommandPreset.value = null;
}
} }
} }

View File

@@ -450,6 +450,14 @@ extension _Widgets on _ServerEditPageState {
} }
Widget _buildProxyCommand() { Widget _buildProxyCommand() {
if (Platform.isIOS) {
return ListTile(
title: const Text('ProxyCommand'),
subtitle: const Text('ProxyCommand is not available on iOS'),
trailing: const Icon(Icons.block, color: Colors.grey),
);
}
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [