diff --git a/README.md b/README.md index e8aa1ab4..6ac14535 100644 --- a/README.md +++ b/README.md @@ -34,11 +34,14 @@ Especially thanks to dartss - + + + + @@ -52,6 +55,9 @@ Especially thanks to dartss +
+ +
diff --git a/lib/data/res/build_data.dart b/lib/data/res/build_data.dart index fbd8a9df..1fa35f4c 100644 --- a/lib/data/res/build_data.dart +++ b/lib/data/res/build_data.dart @@ -2,9 +2,9 @@ class BuildData { static const String name = "ServerBox"; - static const int build = 191; + static const int build = 193; static const String engine = "Flutter 3.7.0 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision b06b8b2710 (5 days ago) • 2023-01-23 16:55:55 -0800\nEngine • revision b24591ed32\nTools • Dart 2.19.0 • DevTools 2.20.1\n"; - static const String buildAt = "2023-01-28 22:51:04.087758"; - static const int modifications = 3; + static const String buildAt = "2023-01-28 23:51:19.423469"; + static const int modifications = 2; } diff --git a/lib/view/page/pkg.dart b/lib/view/page/pkg.dart index bd6c5c39..419755a4 100644 --- a/lib/view/page/pkg.dart +++ b/lib/view/page/pkg.dart @@ -177,15 +177,6 @@ class _PkgManagePageState extends State return ListView( padding: const EdgeInsets.all(13), children: [ - Padding( - padding: const EdgeInsets.all(17), - child: UrlText( - text: - '${_s.experimentalFeature}\n${_s.reportBugsOnGithubIssue(issueUrl)}', - replace: 'Github Issue', - textAlign: TextAlign.center, - ), - ), _buildUpdatePanel(apt) ].map((e) => RoundRectCard(e)).toList(), ); @@ -203,10 +194,7 @@ class _PkgManagePageState extends State subtitle: const Text('>_<', textAlign: TextAlign.center), ); } - return Column( - crossAxisAlignment: CrossAxisAlignment.start, - children: [ - ExpansionTile( + return ExpansionTile( title: Text(_s.foundNUpdate(apt.upgradeable!.length)), subtitle: Text( apt.upgradeable!.map((e) => e.package).join(', '), @@ -221,32 +209,18 @@ class _PkgManagePageState extends State onPressed: () { apt.upgrade(); }), - SizedBox( - height: _media.size.height * 0.73, - child: ListView( - controller: _scrollController, - children: apt.upgradeable! + ...apt.upgradeable! .map((e) => _buildUpdateItem(e, apt)) - .toList(), - ), - ) + .toList() ] : [ - SizedBox( - height: _media.size.height * 0.7, - child: ConstrainedBox( - constraints: const BoxConstraints.expand(), - child: SingleChildScrollView( + SingleChildScrollView( padding: const EdgeInsets.all(18), controller: _scrollController, child: Text(apt.upgradeLog!), - ), - ), - ) + ) ], - ) - ], - ); + ); } Widget _buildUpdateItem(UpgradePkgInfo info, PkgProvider apt) { diff --git a/lib/view/page/ssh.dart b/lib/view/page/ssh.dart index dd253da9..03aab165 100644 --- a/lib/view/page/ssh.dart +++ b/lib/view/page/ssh.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'package:dartssh2/dartssh2.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; import 'package:toolbox/data/store/setting.dart'; @@ -11,6 +12,7 @@ import '../../core/utils.dart'; import '../../data/model/server/server_private_info.dart'; import '../../data/provider/server.dart'; import '../../data/res/terminal_theme.dart'; +import '../../data/store/private_key.dart'; import '../../locator.dart'; class SSHPage extends StatefulWidget { @@ -23,7 +25,7 @@ class SSHPage extends StatefulWidget { class _SSHPageState extends State { late final terminal = Terminal(inputHandler: keyboard); - late final SSHSession session; + late final SSHClient client; final keyboard = VirtualKeyboard(defaultInputHandler); late double _screenWidth; @@ -44,23 +46,14 @@ class _SSHPageState extends State { @override void dispose() { - session.close(); + client.close(); super.dispose(); } Future initTerminal() async { terminal.write('Connecting...\r\n'); - final client = locator() - .servers - .where((e) => e.spi.id == widget.spi.id) - .first - .client; - if (client == null) { - terminal.write('Failed to connect\r\n'); - return; - } - + client = await genClient(widget.spi); terminal.write('Connected\r\n'); final wxh = locator().sshTermSize.fetch()!; @@ -69,7 +62,7 @@ class _SSHPageState extends State { final h = int.parse(split.last); terminal.resize(w, h); - session = await client.shell( + final session = await client.shell( pty: SSHPtyConfig( width: terminal.viewWidth, height: terminal.viewHeight, @@ -191,6 +184,23 @@ class _SSHPageState extends State { } } +Future genClient(ServerPrivateInfo spi) async { + final socket = await SSHSocket.connect(spi.ip, spi.port); + if (spi.pubKeyId == null) { + return SSHClient( + socket, + username: spi.user, + onPasswordRequest: () => spi.pwd, + ); + } + final key = locator().get(spi.pubKeyId!); + return SSHClient( + socket, + username: spi.user, + identities: await compute(loadIndentity, key.privateKey), + ); +} + class VirtualKey { final TerminalKey key; final String text; diff --git a/screenshots/detail.jpg b/screenshots/detail.jpg new file mode 100644 index 00000000..91aba26b Binary files /dev/null and b/screenshots/detail.jpg differ diff --git a/screenshots/server_detail.png b/screenshots/server_detail.png deleted file mode 100644 index e78a532e..00000000 Binary files a/screenshots/server_detail.png and /dev/null differ diff --git a/screenshots/ssh.jpg b/screenshots/ssh.jpg index 6c640dbe..f56f868a 100644 Binary files a/screenshots/ssh.jpg and b/screenshots/ssh.jpg differ