Files
termscp/src/filetransfer/params/smb.rs
2026-03-21 16:10:15 +01:00

134 lines
3.6 KiB
Rust

//! ## SMB Parameters
//!
//! Defines the runtime connection parameters used to build SMB remote
//! filesystem clients.
/// Connection parameters for SMB protocol
#[derive(Debug, Clone)]
pub struct SmbParams {
/// Hostname or address of the SMB server.
pub address: String,
#[cfg(posix)]
/// SMB service port used on POSIX platforms.
pub port: u16,
/// Share name to mount.
pub share: String,
/// Optional username.
pub username: Option<String>,
/// Optional password.
pub password: Option<String>,
#[cfg(posix)]
/// Optional workgroup used on POSIX platforms.
pub workgroup: Option<String>,
}
// -- SMB params
impl SmbParams {
/// Instantiates a new `AwsS3Params` struct
pub fn new<S: AsRef<str>>(address: S, share: S) -> Self {
Self {
address: address.as_ref().to_string(),
#[cfg(posix)]
port: 445,
share: share.as_ref().to_string(),
username: None,
password: None,
#[cfg(posix)]
workgroup: None,
}
}
#[cfg(posix)]
pub fn port(mut self, port: u16) -> Self {
self.port = port;
self
}
pub fn username(mut self, username: Option<impl ToString>) -> Self {
self.username = username.map(|x| x.to_string());
self
}
pub fn password(mut self, password: Option<impl ToString>) -> Self {
self.password = password.map(|x| x.to_string());
self
}
#[cfg(posix)]
pub fn workgroup(mut self, workgroup: Option<impl ToString>) -> Self {
self.workgroup = workgroup.map(|x| x.to_string());
self
}
/// Returns whether a password is supposed to be required for this protocol params.
/// The result true is returned ONLY if the supposed secret is MISSING!!!
pub fn password_missing(&self) -> bool {
self.password.is_none()
}
/// Set password
#[cfg(posix)]
pub fn set_default_secret(&mut self, secret: String) {
self.password = Some(secret);
}
#[cfg(win)]
pub fn set_default_secret(&mut self, _secret: String) {}
}
#[cfg(test)]
mod test {
use pretty_assertions::assert_eq;
use super::*;
#[test]
fn should_init_smb_params() {
let params = SmbParams::new("localhost", "temp");
assert_eq!(&params.address, "localhost");
#[cfg(posix)]
assert_eq!(params.port, 445);
assert_eq!(&params.share, "temp");
#[cfg(posix)]
assert!(params.username.is_none());
#[cfg(posix)]
assert!(params.password.is_none());
#[cfg(posix)]
assert!(params.workgroup.is_none());
}
#[test]
#[cfg(posix)]
fn should_init_smb_params_with_optionals() {
let params = SmbParams::new("localhost", "temp")
.port(3456)
.username(Some("foo"))
.password(Some("bar"))
.workgroup(Some("baz"));
assert_eq!(&params.address, "localhost");
assert_eq!(params.port, 3456);
assert_eq!(&params.share, "temp");
assert_eq!(params.username.as_deref().unwrap(), "foo");
assert_eq!(params.password.as_deref().unwrap(), "bar");
assert_eq!(params.workgroup.as_deref().unwrap(), "baz");
}
#[test]
#[cfg(win)]
fn should_init_smb_params_with_optionals() {
let params = SmbParams::new("localhost", "temp")
.username(Some("foo"))
.password(Some("bar"));
assert_eq!(&params.address, "localhost");
assert_eq!(&params.share, "temp");
assert_eq!(params.username.as_deref().unwrap(), "foo");
assert_eq!(params.password.as_deref().unwrap(), "bar");
}
}