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