SMB support (#184)

* feat: smb client

* fix: smb connection

* fix: smbclient deps

* feat: SMB mentions to user manual

* feat: changelog

* dlib macos

* fix: removed smb support from macos :(

* fix: restored libsmbclient build

* fix: strange lint message

* fix: macos build smb

* fix: macos build smb

* fix: macos tests

* fix: macos lint

* feat: SMB windows support

* fix: windows tests
This commit is contained in:
Christian Visintin
2023-05-13 15:00:16 +02:00
committed by GitHub
parent a13663e5e9
commit b7369162d2
54 changed files with 1256 additions and 154 deletions

View File

@@ -3,7 +3,7 @@ use remotefs::fs::UnixPex;
use super::{FileTransferActivity, LogLevel};
impl FileTransferActivity {
#[cfg(target_family = "unix")]
#[cfg(unix)]
pub fn action_local_chmod(&mut self, mode: UnixPex) {
let files = self.get_local_selected_entries().get_files();
@@ -51,7 +51,7 @@ impl FileTransferActivity {
}
}
#[cfg(target_family = "unix")]
#[cfg(unix)]
pub fn action_find_local_chmod(&mut self, mode: UnixPex) {
let files = self.get_found_selected_entries().get_files();

View File

@@ -9,7 +9,7 @@ use super::{FileTransferActivity, LogLevel, SelectedFile};
impl FileTransferActivity {
/// Create symlink on localhost
#[cfg(target_family = "unix")]
#[cfg(unix)]
pub(crate) fn action_local_symlink(&mut self, name: String) {
if let SelectedFile::One(entry) = self.get_local_selected_entries() {
match self
@@ -33,7 +33,7 @@ impl FileTransferActivity {
}
}
#[cfg(target_family = "windows")]
#[cfg(windows)]
pub(crate) fn action_local_symlink(&mut self, _name: String) {
self.mount_error("Symlinks are not supported on Windows hosts");
}

View File

@@ -13,7 +13,7 @@ use tuirealm::props::{
Alignment, BorderSides, BorderType, Borders, Color, InputType, Style, TableBuilder, TextSpan,
};
use tuirealm::{Component, Event, MockComponent, NoUserEvent, State, StateValue};
#[cfg(target_family = "unix")]
#[cfg(unix)]
use users::{get_group_by_gid, get_user_by_uid};
use super::super::Browser;
@@ -445,7 +445,7 @@ impl FileInfoPopup {
.add_col(TextSpan::from("Last access time: "))
.add_col(TextSpan::new(atime.as_str()).fg(Color::LightRed));
// User
#[cfg(target_family = "unix")]
#[cfg(unix)]
let username: String = match file.metadata().uid {
Some(uid) => match get_user_by_uid(uid) {
Some(user) => user.name().to_string_lossy().to_string(),
@@ -453,10 +453,10 @@ impl FileInfoPopup {
},
None => String::from("0"),
};
#[cfg(target_os = "windows")]
#[cfg(windows)]
let username: String = format!("{}", file.metadata().uid.unwrap_or(0));
// Group
#[cfg(target_family = "unix")]
#[cfg(unix)]
let group: String = match file.metadata().gid {
Some(gid) => match get_group_by_gid(gid) {
Some(group) => group.name().to_string_lossy().to_string(),
@@ -464,7 +464,7 @@ impl FileInfoPopup {
},
None => String::from("0"),
};
#[cfg(target_os = "windows")]
#[cfg(windows)]
let group: String = format!("{}", file.metadata().gid.unwrap_or(0));
texts
.add_row()

View File

@@ -111,6 +111,7 @@ impl FileTransferActivity {
match &ft_params.params {
ProtocolParams::Generic(params) => params.address.clone(),
ProtocolParams::AwsS3(params) => params.bucket_name.clone(),
ProtocolParams::Smb(params) => params.address.clone(),
}
}
@@ -133,6 +134,13 @@ impl FileTransferActivity {
);
format!("Connecting to {}", params.bucket_name)
}
ProtocolParams::Smb(params) => {
info!(
"Client is not connected to remote; connecting to {}:{}",
params.address, params.share
);
format!("Connecting to \\\\{}\\{}", params.address, params.share)
}
}
}

View File

@@ -220,6 +220,8 @@ pub struct FileTransferActivity {
cache: Option<TempDir>,
/// Fs watcher
fswatcher: Option<FsWatcher>,
/// conncted once
connected: bool,
}
impl FileTransferActivity {
@@ -252,6 +254,7 @@ impl FileTransferActivity {
None
}
},
connected: false,
}
}
@@ -372,14 +375,12 @@ impl Activity for FileTransferActivity {
return;
}
// Check if connected (popup must be None, otherwise would try reconnecting in loop in case of error)
if !self.client.is_connected() && !self.app.mounted(&Id::FatalPopup) {
if (!self.client.is_connected() || !self.connected) && !self.app.mounted(&Id::FatalPopup) {
let ftparams = self.context().ft_params().unwrap();
// print params
let msg: String = Self::get_connection_msg(&ftparams.params);
// Set init state to connecting popup
self.mount_wait(msg.as_str());
// Force ui draw
self.view();
self.mount_blocking_wait(msg.as_str());
// Connect to remote
self.connect();
// Redraw

View File

@@ -57,6 +57,7 @@ impl FileTransferActivity {
// Connect to remote
match self.client.connect() {
Ok(Welcome { banner, .. }) => {
self.connected = true;
if let Some(banner) = banner {
// Log welcome
self.log(

View File

@@ -36,13 +36,13 @@ impl FileTransferActivity {
self.umount_chmod();
self.mount_blocking_wait("Applying new file mode…");
match self.browser.tab() {
#[cfg(target_family = "unix")]
#[cfg(unix)]
FileExplorerTab::Local => self.action_local_chmod(mode),
#[cfg(target_family = "unix")]
#[cfg(unix)]
FileExplorerTab::FindLocal => self.action_find_local_chmod(mode),
FileExplorerTab::Remote => self.action_remote_chmod(mode),
FileExplorerTab::FindRemote => self.action_find_remote_chmod(mode),
#[cfg(target_family = "windows")]
#[cfg(windows)]
FileExplorerTab::Local | FileExplorerTab::FindLocal => {}
}
self.umount_wait();
@@ -441,13 +441,13 @@ impl FileTransferActivity {
}
UiMsg::ShowChmodPopup => {
let selected_file = match self.browser.tab() {
#[cfg(target_family = "unix")]
#[cfg(unix)]
FileExplorerTab::Local => self.get_local_selected_entries(),
#[cfg(target_family = "unix")]
#[cfg(unix)]
FileExplorerTab::FindLocal => self.get_found_selected_entries(),
FileExplorerTab::Remote => self.get_remote_selected_entries(),
FileExplorerTab::FindRemote => self.get_found_selected_entries(),
#[cfg(target_family = "windows")]
#[cfg(windows)]
FileExplorerTab::Local | FileExplorerTab::FindLocal => SelectedFile::None,
};
if let Some(mode) = selected_file.unix_pex() {