fix(sftp): FIx Permission Denied While Accessing SFTP (#1019)

* fix(storage): Set the initial SFTP path based on the user's role

When the user is not root, set the initial path to `/home/$user`. For root users, use `/root` as the path

* chore: Add issue participants into github_id

* fix(sftp): Improved the logic for obtaining the initial path and asynchronously processed directory listings

Attempt to obtain the user's home directory path by executing a command, and fall back to the default path if it fails. At the same time, change the _listDir call to asynchronous to avoid potential issues.

* fix(storage): Fixed the logic for determining the initial path of SFTP

Change the condition from checking if the path is not equal to '~' to checking if the path starts with '/', to ensure the correct user home directory path is obtained
This commit is contained in:
GT610
2026-01-22 13:49:48 +08:00
committed by GitHub
parent f47d1e7141
commit 84a1bd5519
2 changed files with 24 additions and 3 deletions

View File

@@ -131,6 +131,12 @@ abstract final class GithubIds {
'Lancerys',
'yaziku',
'yeluosln',
'FadeFx',
'Snihc1205',
'Bjups',
'4061N',
'itmagpro',
'atikattar1104'
};
}

View File

@@ -79,8 +79,23 @@ class _SftpPageState extends ConsumerState<SftpPage> with AfterLayoutMixin {
}
@override
FutureOr<void> afterFirstLayout(BuildContext context) {
var initPath = '/';
FutureOr<void> afterFirstLayout(BuildContext context) async {
String initPath;
try {
final homeResult = await _client.run('eval echo ~${widget.args.spi.user}');
final homePath = homeResult.string.trim();
if (homePath.isNotEmpty && homePath.startsWith('/')) {
initPath = homePath;
} else {
final user = widget.args.spi.user;
initPath = user != 'root' ? '/home/$user' : '/root';
}
} catch (_) {
final user = widget.args.spi.user;
initPath = user != 'root' ? '/home/$user' : '/root';
}
if (Stores.setting.sftpOpenLastPath.fetch()) {
final history = Stores.history.sftpLastPath.fetch(widget.args.spi.id);
if (history != null) {
@@ -89,7 +104,7 @@ class _SftpPageState extends ConsumerState<SftpPage> with AfterLayoutMixin {
}
_status.path.path = widget.args.initPath ?? initPath;
_listDir();
unawaited(_listDir());
}
}