Skip to content

Commit

Permalink
feat: More customization on clients (#28)
Browse files Browse the repository at this point in the history
* feat(Client.cs): Added public key, private key and auto discovery

* feat(Exchange.cs): Auto server discovery

* feat(FTP.cs): Certificate validation

* feat(SFTP.cs): Certificate validation

* feat(SFTP.cs): Private key support

* perf(SFTP.cs): Usage of disposable private key

* fix(Client.cs): Null values by default

* docs(Clients): Clearer name of client attribute

* docs(Clients): Name violation of precedent commit
  • Loading branch information
FRFlo authored Mar 12, 2024
1 parent edf87fa commit f84f8bc
Show file tree
Hide file tree
Showing 6 changed files with 76 additions and 11 deletions.
22 changes: 17 additions & 5 deletions Copy/Clients/Exchange.cs
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ internal class Exchange : IClient
/// </summary>
private readonly ExchangeService ExchangeService;

public Client Credentials => _credentials;
public Client Config => _credentials;

/// <summary>
/// Constructor.
Expand All @@ -23,11 +23,23 @@ internal class Exchange : IClient
public Exchange(Client credentials)
{
_credentials = credentials;
ExchangeService = new ExchangeService()

if (credentials.Autodiscover)
{
ExchangeService = new ExchangeService()
{
Credentials = new WebCredentials(credentials.Username, credentials.Password)
};
ExchangeService.AutodiscoverUrl(credentials.Username);
}
else
{
Credentials = new WebCredentials(credentials.Username, credentials.Password),
Url = new Uri(credentials.Host)
};
ExchangeService = new ExchangeService()
{
Credentials = new WebCredentials(credentials.Username, credentials.Password),
Url = new Uri(credentials.Host)
};
}
}

public bool DoFileExist(string path)
Expand Down
17 changes: 16 additions & 1 deletion Copy/Clients/FTP.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ internal class FTP : IClient
/// </summary>
private readonly FtpClient FtpClient;

public Client Credentials => _credentials;
public Client Config => _credentials;

/// <summary>
/// Constructor.
Expand All @@ -30,6 +30,21 @@ public FTP(Client credentials)
_credentials = credentials;
FtpClient = new FtpClient(credentials.Host, new NetworkCredential(credentials.Username, credentials.Password), credentials.Port);
FtpClient.Config.EncryptionMode = FtpEncryptionMode.Auto;
FtpClient.ValidateCertificate += (client, args) =>
{
if (credentials.Fingerprint == null)
{
args.Accept = true;
}
else if (args.Certificate.GetCertHashString() == credentials.Fingerprint)
{
args.Accept = true;
}
else
{
args.Accept = false;
}
};
FtpClient.AutoConnect();
}

Expand Down
2 changes: 1 addition & 1 deletion Copy/Clients/Local.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ internal class Local : IClient
/// </summary>
private readonly Client _credentials;

public Client Credentials => _credentials;
public Client Config => _credentials;

/// <summary>
/// Constructor.
Expand Down
27 changes: 25 additions & 2 deletions Copy/Clients/SFTP.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,35 @@ internal class SFTP : IClient
/// </summary>
private readonly SftpClient SftpClient;

public Client Credentials => _credentials;
public Client Config => _credentials;

public SFTP(Client credentials)
{
_credentials = credentials;
SftpClient = new SftpClient(credentials.Host, credentials.Port, credentials.Username, credentials.Password);
if (credentials.Fingerprint != null)
{
using PrivateKeyFile privateKey = new(credentials.PrivateKey);
SftpClient = new SftpClient(credentials.Host, credentials.Port, credentials.Username, privateKey);
}
else
{
SftpClient = new SftpClient(credentials.Host, credentials.Port, credentials.Username, credentials.Password);
}
SftpClient.HostKeyReceived += (client, args) =>
{
if (credentials.Fingerprint == null)
{
args.CanTrust = true;
}
else if (args.FingerPrintMD5 == credentials.Fingerprint)
{
args.CanTrust = true;
}
else
{
args.CanTrust = false;
}
};
SftpClient.Connect();
}

Expand Down
15 changes: 15 additions & 0 deletions Copy/Types/Client.cs
Original file line number Diff line number Diff line change
Expand Up @@ -63,5 +63,20 @@ public int Port
/// </summary>
[JsonProperty(PropertyName = "Password", Required = Required.Default)]
public string? Password { get; set; }
/// <summary>
/// Private key of the client.
/// </summary>
[JsonProperty(PropertyName = "PrivateKey", Required = Required.Default)]
public string? PrivateKey { get; set; } = null;
/// <summary>
/// Fingerprint of the server.
/// </summary>
[JsonProperty(PropertyName = "Fingerprint", Required = Required.Default)]
public string? Fingerprint { get; set; } = null;
/// <summary>
/// Exchange autodiscover server.
/// </summary>
[JsonProperty(PropertyName = "Autodiscover", Required = Required.Default)]
public bool Autodiscover { get; set; } = false;
}
}
4 changes: 2 additions & 2 deletions Copy/Types/IClient.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@
internal interface IClient : IDisposable
{
/// <summary>
/// Client credentials.
/// Client configuration.
/// </summary>
Client Credentials { get; }
Client Config { get; }
/// <summary>
/// List files in a directory.
/// </summary>
Expand Down

0 comments on commit f84f8bc

Please sign in to comment.