Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add async support to SftpClient and SftpFileStream #819

Merged
merged 11 commits into from
Dec 14, 2021

Conversation

IgorMilavec
Copy link
Collaborator

@IgorMilavec IgorMilavec commented May 4, 2021

Core async support requested by #153.

Added async support to BaseClient: (update 2021-05-11)

  • ConnectAsync

Added async support to SftpClient:

  • ListDirectoryAsync
  • GetStatusAsync
  • OpenAsync
  • DeleteFileAsync
  • RenameFileAsync
  • DownloadFileAsync
  • UploadFileAsync

Added async support to SftpFileStream:

  • OpenAsync
  • ReadAsync
  • WriteAsync
  • FlushAsync

Added net46 target to use async in .NET Framework.

This PR is intended to resolve #153.
This PR is intended to supersede #300 and #661.

{
throw;
}
catch (Exception)

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should the generic class Exception be caught here? Or something more specific?

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Possibly, but I only reused the logic of sync versions of the functions at this time. When/if this is released, practice will show if any changes need to be made.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When FileMode is Create, I think we should just use Flags.CreateNewOrOpen | Flags.Truncate.
Let me run some checks later.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can confirm that it's ok to just add Flags.CreateNewOrOpen | Flags.Truncate when mode is FileMode.Create.

if (count < 0)
throw new ArgumentOutOfRangeException("count");
if ((buffer.Length - offset) < count)
throw new ArgumentException("Invalid array range.");

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Specify second parameter to ArgumentException, nameof(buffer).

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm not sure about that, any of the three could be wrong, depending on the caller's intention. Anyhow, this is the same as the sync version, so we either need to change both or none...

/// <exception cref="SftpPermissionDeniedException">Permission to list the contents of the directory was denied by the remote host. <para>-or-</para> A SSH command was denied by the server.</exception>
/// <exception cref="SshException">A SSH error where <see cref="Exception.Message" /> is the message from the remote host.</exception>
/// <exception cref="ObjectDisposedException">The method was called after the client was disposed.</exception>
public async Task<IEnumerable<SftpFile>> ListDirectoryAsync(string path, CancellationToken cancellationToken)
Copy link

@vanillajonathan vanillajonathan May 11, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Consider returning ICollection or IReadOnlyCollection rather than IEnumerable as per the Microsoft Guidelines for Collections.

DO use Collection or a subclass of Collection for properties or return values representing read/write collections.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This should be IAsyncEnumerable<SftpFile>. It's only supported on .NET 4.6.1 or higher.
For .NET 4.6.1 and .NET Standard 2.0, you need to add a reference to Microsoft.Bcl.AsyncInterfaces.

Copy link
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Then we need to remove FEATURE_TAP from netstandard1.3. Also, we take two "external" dependencies (AsyncInterfaces and Task.Extensions).
What if we leave this one as it is and add IAsyncEnumerable<SftpFile> EnumerateDirectoryAsync(...) for netstandard2.1+ ?

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I won't let this block this merge request, but I still strongly consider changing this method to return IAsyncEnumerable<SftpFile>. I also don't like bringing in additional dependencies, but the alternative is not better.

@schaveyt
Copy link
Contributor

Any chance this could also target .net5 or .net6 as well

@IgorMilavec
Copy link
Collaborator Author

The library already targets netstandard2.0, so you can reference it from net5 or net6 projects.
It would only be beneficial for the library to target net5+ if it would use any net5+ features, like Spans etc. But this is out of scope of this issue and this PR. IMO we should remove legacy targets (please see #665) before adding any modern code.

@schaveyt
Copy link
Contributor

I did not connect those dots. Thank you for clarifying 👍

@paulmaybee
Copy link

This addition looks like it has a great deal of value. Is there a timetable or estimate for when the PR will be completed?

@IgorMilavec
Copy link
Collaborator Author

This PR if functionally complete IMO. It should also be stable, I have been running it in production since July. Now we need @drieseng to review and merge it.

@drieseng
Copy link
Member

@IgorMilavec Thanks, I'll try to find time in the coming days.

@IgorMilavec
Copy link
Collaborator Author

Figured this is the last chance to modify UploadFileAsync signature before this becomes a breaking change... :)

@IgorMilavec
Copy link
Collaborator Author

No worries, @drieseng, thanks for the review.
Let me first clear trivial items off the table and then we'll discuss further, OK? I think voice chat would be great at that point.

@IgorMilavec
Copy link
Collaborator Author

I believe I have addressed all the trivial items. @drieseng can you please re-review the code and my comments?

.vs/ProjectSettings.json Outdated Show resolved Hide resolved
.vs/VSWorkspaceState.json Outdated Show resolved Hide resolved
@@ -7,7 +7,7 @@
<AssemblyOriginatorKeyFile>../Renci.SshNet.snk</AssemblyOriginatorKeyFile>
<LangVersion>5</LangVersion>
<SignAssembly>true</SignAssembly>
<TargetFrameworks>net35;net40;netstandard1.3;netstandard2.0</TargetFrameworks>
<TargetFrameworks>net35;net40;net46;netstandard1.3;netstandard2.0</TargetFrameworks>
Copy link
Member

@drieseng drieseng Nov 28, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@IgorMilavec, is it ok for you to target .NET Framework 4.7.2 (or 4.8) instead?

src/Renci.SshNet/Sftp/SftpFileStream.cs Outdated Show resolved Hide resolved
src/Renci.SshNet/Sftp/SftpFileStream.cs Outdated Show resolved Hide resolved
src/Renci.SshNet/Abstractions/SocketAbstraction.cs Outdated Show resolved Hide resolved
src/Renci.SshNet/Abstractions/SocketAbstraction.cs Outdated Show resolved Hide resolved
src/Renci.SshNet/Abstractions/SocketAbstraction.cs Outdated Show resolved Hide resolved
src/Renci.SshNet/Abstractions/SocketAbstraction.cs Outdated Show resolved Hide resolved
{
throw;
}
catch (Exception)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I can confirm that it's ok to just add Flags.CreateNewOrOpen | Flags.Truncate when mode is FileMode.Create.

@drieseng
Copy link
Member

drieseng commented Dec 7, 2021

@IgorMilavec Thanks for hanging on. I'll do my best to finish the review some time this week.

@drieseng drieseng merged commit 7bdfc9e into sshnet:develop Dec 14, 2021
@drieseng
Copy link
Member

We're still lacking (unit & integration) test coverage, but I'm ok with adding these as a follow PR.
I'd also like to discuss further how to proceed with ISftpClient.ListDirectoryAsync(...). In its current state, this is not a true async method.

That said: Thx !!!!!!!!

@Dimencia
Copy link

Working on a large project at work and just ran into this being a problem, that's awesome that hours before I (realized I) needed it, there was already a PR merged

I'll be pulling this down and trying it tomorrow, nice work, and thanks

@IgorMilavec
Copy link
Collaborator Author

Thanks @drieseng !
I'll start working on unit tests. After these are complete I can tackle the message pump and make it Task based as we already discussed.
Regarding ISftpClient.ListDirectoryAsync(...): the current version is already async, but it is not "streaming". For directories with small amount of files (up to the amount that SftpReadDirRequest returns) there is no difference. For a directory with large amount of files, the current implementation only completes (asynchronously) when all the file infos are read. The IAsyncEnumerable implementation would allow the caller to process file names in chunks (of the amount returned by one SftpReadDirRequest) even before all the file infos are read back. Let me implement another function with IAsyncEnumerable and then we can discuss further, OK?

@drieseng
Copy link
Member

@IgorMilavec Thanks for taking this up. I'm ok with having a second method for ISftpClient.ListDirectoryAsync(...) as POC.

@noahmehl
Copy link

When we review this PR, it looks like these methods are not actually implemented:

  • DownloadFileAsync
  • UploadFileAsync

Are we just mis-understanding the PR itself?

@IgorMilavec
Copy link
Collaborator Author

These functions were initially implemented as part of this PR, but during the code review we decided that these functions are not really necessary, as they can be easily implemented in the consuming code with a couple of lines of code.

If you have no special requirements, you can use this extension class to get these two functions:

namespace Renci.SshNet
{
    public static class SftpClientExtensions
    {
        public static async Task DownloadFileAsync(this SftpClient sftpClient, string path, Stream output, CancellationToken cancellationToken)
        {
            using (Stream remoteStream = await sftpClient.OpenAsync(path, FileMode.Open, FileAccess.Read, cancellationToken).ConfigureAwait(false))
            {
                await remoteStream.CopyToAsync(output, 81920, cancellationToken).ConfigureAwait(false);
            }
        }

        public static async Task UploadFileAsync(this SftpClient sftpClient, Stream input, string path, FileMode createMode, CancellationToken cancellationToken)
        {
            using (Stream remoteStream = await sftpClient.OpenAsync(path, createMode, FileAccess.Write, cancellationToken).ConfigureAwait(false))
            {
                await input.CopyToAsync(remoteStream, 81920, cancellationToken).ConfigureAwait(false);
            }
        }
    }
}

@noahmehl
Copy link

noahmehl commented Jan 2, 2022

@IgorMilavec Thank you so much for your quick and thoughtful reply. We will take a look at this asap.

@jjxtra
Copy link

jjxtra commented Jul 19, 2022

Are these methods in official nuget? Not seeing any async methods on the sftpclient...

@vanillajonathan
Copy link

vanillajonathan commented Jul 20, 2022

I think the DownloadFileAsync and UploadFileAsync methods ought to be included, because I think this should be a async-first library where async should be the default behavior users use, and it should be easy to do so.

To be honest, I would like to see the non-async methods get removed as well as the legacy Begin* and End* async functions.

drieseng pushed a commit that referenced this pull request May 24, 2023
* Add FEATURE_TAP and net472 target
* Add TAP async support to SftpClient and SftpFileStream
* Add async support to DnsAbstraction and SocketAbstraction
* Add async support to *Connector and refactor the hierarchy
* Add ConnectAsync to BaseClient
WojciechNagorski added a commit that referenced this pull request Oct 10, 2023
* Assets/logos (#782)

* Added logo assets

* Added PNG 1260x640 with white border

Co-authored-by: 103filgualan <[email protected]>

* OPENSSH KeyReader for more keys (#614)

* OPENSSH KeyReader for more keys

Add support to parse OpenSSH Keys with ECDSA 256/384/521 and RSA.

https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key

Change-Id: Iaa9cce0f2522e5fee377a82cb252f81f0b7cc563

* Fix ED25519Key KeyLength

* Fix ED25519 PubKey-auth

LeadingZeros of BigInteger-Conversion have to be removed
before sending the Key.

* Add interface to SftpFile #120 (#812)

* Create ISftpFile interface. SftpFile sealed. Return ISftpFile from SftpClient instead of SftpFile. Make ISftpClient interface disposable.

Co-authored-by: Wojciech Swieboda <[email protected]>

* Start MessageListener with ThreadAbstraction.ExecuteThreadLongRunning (#902)

* Fix Thread pool exhaustion due to MessageListener running on ThreadPool
* Mark long running thread as background

* Add async support to SftpClient and SftpFileStream (#819)

* Add FEATURE_TAP and net472 target
* Add TAP async support to SftpClient and SftpFileStream
* Add async support to DnsAbstraction and SocketAbstraction
* Add async support to *Connector and refactor the hierarchy
* Add ConnectAsync to BaseClient

* Add CODEOWNERS file.

* Fix virus false-positive by Defender on Renci.SSHNet.Tests.dll (#867)

Co-authored-by: Pedro Fonseca <[email protected]>

* Add unit tests for task-based asynchronous API (#906)

* Fix runtime and culture dependant tests.
* Set C# 7.3 in Tests.csproj to limit intellisense's suggestions under different targets
* Add SftpClientTest.*Async
* Add SftpFileStreamTest_OpenAsync_*
* Add SftpFileStreamTest_WriteAsync_*
* Add SftpFileStreamTest_ReadAsync_*
* Align AppVeyor script with Test project target frameworks

* correct 'Documenation' to 'Documentation' (#838)

in the documentation's window title

* Agent auth and Keygen (#794)

* Allow to set PrivateKeyFile Key directly
   So you can add your own Key-Classes to SSH.NET
* Add ED25519 ctor for just pub key part.
* Make ECDSA Key Bits accessible
   You cant export imported CngKeys. To be able to export them to agent or Key-Files make the private bits also accessible.
* Better NETFRAMEWORK vs NETSTANDARD handling
* Add Comment Property to Key
* Add IPrivateKeySource
  So Extension can add own PrivateKeyFiles, e.g. PuttyKeyFile.

* Use cryptographically secure random number generator.
Fixes CVE-2022-29245.

* Remove unused import.

* Add IBaseClient for BaseClient and ISftpClient to inherit from (#975)

Add IBaseClient for BaseClient and ISftpClient to inherit from

* fix typo (#999)

* Fix Seek Operations in SftpFileStream (#910)

* Fix offset operations in SftpFileStream.Seek
* Fix seek exception message and add default case for invalid seek origin
* Use named params when throwing ArgumentException
* Add tests for seeking from end of file

* Add back copyright to license. (#1060)

Fixes #1059.

* Removing old target frameworks (#1109)

Remove support for legacy / deprecated target frameworks while adding support for .NET 6.0 (and higher).
The supported target frameworks are now:
* .NETFramework 4.6.2 (and higher)
* .NET Standard 2.0
* .NET 6.0 (and higher)

* Remove old features [Part 1] (#1117)

Remove obsolete feature switches (now that we've remove support for legacy target frameworks) and remove corresponding conditional code.

* Remove FEATURE_DIRECTORYINFO_ENUMERATEFILES (#1119)

* Remove FEATURE_DIRECTORYINFO_ENUMERATEFILES
* Add exception documentation

* Fix some (lots of) issues reported by analyzers. (#1125)

Fix some (lots of) issues reported by analyzers.

* Round 2 of analyzer fixes and general cleanup. (#1132)

* Analyzer fixes round 3. (#1135)

* Replace Array<T>.Empty with Array.Empty<T>() (#1137)

* Replace IsNullOrWhiteSpace extension (#1142)

* Use License Expression for NuGet Package

licenseUrl is deprecated, see NuGet/Announcements#32

* Integration tests

* Remove todos

* Update CODEOWNERS

* Use correct SSH.NET

* ListDirectoryAsync return IAsyncEnumerable (#1126)

* ListDirectoryAsync return IAsyncEnumerable

* Fix documentation

* Update README.md

* Fix

* Add Sftp ListDirectoryAsync test

* Revert

* Integration tests for ListDirectoryAsync with IAsyncEnumerable

* Fix the assembly resolution build warning (#1165)

* Delete performance/longrunning tests (#1143)

Co-authored-by: Wojciech Nagórski <[email protected]>

* Move Integration tests (#1173)

* Renci.SshNet.IntegrationTests

* Renci.SshNet.TestTools.OpenSSH

* Move integration tests to main repo

* Move old tests to new integration tests

* Move old integration tests to new integration tests

* Move more tests

* Move authentication tests

* Move SshClientTests

* Fix some tests

* Remove duplicated test

* Poc of ProcessDisruptor

* Rename

* Some fixes

* Remove performance tests

* Small improvements

* Add a benchmarks project (#1151)

* Add a benchmarks project

* Small improvements

---------

Co-authored-by: Wojciech Nagórski <[email protected]>

* Use ExceptionDispatchInfo to retain call stack in Session.WaitOnHandle() (#936)

* Use ExceptionDispatchInfo to retain call stack in Session.WaitOnHandle()

* merge

* Update src/Renci.SshNet/Session.cs

Co-authored-by: Rob Hague <[email protected]>

---------

Co-authored-by: Wojciech Nagórski <[email protected]>
Co-authored-by: Rob Hague <[email protected]>

* Support SHA256 fingerprints for host key validation (#1098)

* Add tests for HostKeyEventArgs

* Add SHA256 fingerprint support

* Add support for RSA SHA-2 public key algorithms (#1177)

* Abstract out the hash algorithm from RsaDigitalSignature

* Add integration tests

* Add DigitalSignature property to KeyHostAlgorithm

* Add IHostAlgorithmsProvider interface

* Verify the host signature

* Fix HostKeyEventArgsTest after merge

* Remove PubkeyAcceptedAlgorithms ssh-rsa

* Add test coverage for RSA keys in PrivateKeyFile

* Obsolete IPrivateKeySource

---------

Co-authored-by: Wojciech Nagórski <[email protected]>

* Improvements after #1177 (#1180)

* Use ExceptionDispatchInfo in more places (#1182)

Co-authored-by: Wojciech Nagórski <[email protected]>

* Try to "fix" the flaky test (#1185)

* Enable DSA tests (#1181)

Co-authored-by: Wojciech Nagórski <[email protected]>

* FingerPrints (#1186)

* Use OS-agnostic socket error codes to allow tests run on different OSes (#1179)

SocketErrorCode is OS agnostic, ErrorCode is OS specific.

On Windows ErrorCode = (int) SocketErrorCode, but on Mac and Unix it is not.

For example ExitCode for HostNotFound (11001) on Windows is 11001, on Mac & Unix is -131073. So testing for ExitCode == 11001 fails on Mac & Unix.

Co-authored-by: Wojciech Nagórski <[email protected]>

* Fix for channel session semaphore from thread blocking (#1071)

* Merging fix from @clivetong into our own SSH.NET fork
- The following article describes some of the issues with the double check lock that we have seen issues with: https://www.sudhanshutheone.com/posts/double-check-lock-csharp

* Merging fix from @clivetong into our own SSH.NET fork
- The following article describes some of the issues with the double check lock that we have seen issues with: https://www.sudhanshutheone.com/posts/double-check-lock-csharp

* Update Channel to fix AppVeyor failure (field should be readonly)

* Update ISftpClient for #120 (#1193)

* Implement set last write and access time (#1194)

* Add/migrate hmac+cipher integration tests (#1189)

* Add/migrate hmac+cipher integration tests

* fix integration tests

---------

Co-authored-by: Wojciech Nagórski <[email protected]>

* Update tests for SetLastAccessTime(Utc) to also verify the time component and the Kind of the DateTime value returned by GetLastAccessTime(Utc). (#1198)

---------

Co-authored-by: Filippo Gualandi <[email protected]>
Co-authored-by: 103filgualan <[email protected]>
Co-authored-by: Stefan Rinkes <[email protected]>
Co-authored-by: wxtsxt <[email protected]>
Co-authored-by: Wojciech Swieboda <[email protected]>
Co-authored-by: Igor Milavec <[email protected]>
Co-authored-by: drieseng <[email protected]>
Co-authored-by: Pedro Fonseca <[email protected]>
Co-authored-by: Pedro Fonseca <[email protected]>
Co-authored-by: Maximiliano Jabase <[email protected]>
Co-authored-by: Owen Krueger <[email protected]>
Co-authored-by: Masuri <[email protected]>
Co-authored-by: LemonPi314 <[email protected]>
Co-authored-by: Gert Driesen <[email protected]>
Co-authored-by: Rob Hague <[email protected]>
Co-authored-by: Rob Hague <[email protected]>
Co-authored-by: Marius Thesing <[email protected]>
Co-authored-by: Dāvis Mošenkovs <[email protected]>
Co-authored-by: Dmitry Tsarevich <[email protected]>
Co-authored-by: Patrick Yates <[email protected]>
@WojciechNagorski
Copy link
Collaborator

Version 2023.0.0 has been published https://www.nuget.org/packages/SSH.NET/2023.0.0

@snargledorf
Copy link
Contributor

Something that just bit me is that the OpenAsync method expects an absolute path while the Begin/End async methods for Upload/Download operate relative to the working directory.

Not sure what the best way to handle this would be, but it might be less likely to make a mistake if there were replacement methods on the SftpClient (DownloadAsync/UploadAsync) that behaved in the same way as the Begin/End methods (Relative to working directory), while OpenAsync remains absolute as to not break existing code.

@MarkEnverus
Copy link

MarkEnverus commented Nov 2, 2023

namespace Renci.SshNet
{
    public static class SftpClientExtensions
    {
        public static async Task DownloadFileAsync(this SftpClient sftpClient, string path, Stream output, CancellationToken cancellationToken)
        {
            using (Stream remoteStream = await sftpClient.OpenAsync(path, FileMode.Open, FileAccess.Read, cancellationToken).ConfigureAwait(false))
            {
                await remoteStream.CopyToAsync(output, 81920, cancellationToken).ConfigureAwait(false);
            }
        }

        public static async Task UploadFileAsync(this SftpClient sftpClient, Stream input, string path, FileMode createMode, CancellationToken cancellationToken)
        {
            using (Stream remoteStream = await sftpClient.OpenAsync(path, createMode, FileAccess.Write, cancellationToken).ConfigureAwait(false))
            {
                await input.CopyToAsync(remoteStream, 81920, cancellationToken).ConfigureAwait(false);
            }
        }
    }
}

@IgorMilavec the issue here is that we cannot moq this code since we can't create a SftpFileStream (as it's not an interface and it's private). Whereas we can moq UploadFile (void return) unless OpenAsync returned a generic Stream instead of a wrapped Stream

WojciechNagorski added a commit that referenced this pull request Dec 29, 2023
* Release 2023.0.0 (#1201)

* Assets/logos (#782)

* Added logo assets

* Added PNG 1260x640 with white border

Co-authored-by: 103filgualan <[email protected]>

* OPENSSH KeyReader for more keys (#614)

* OPENSSH KeyReader for more keys

Add support to parse OpenSSH Keys with ECDSA 256/384/521 and RSA.

https://github.com/openssh/openssh-portable/blob/master/PROTOCOL.key

Change-Id: Iaa9cce0f2522e5fee377a82cb252f81f0b7cc563

* Fix ED25519Key KeyLength

* Fix ED25519 PubKey-auth

LeadingZeros of BigInteger-Conversion have to be removed
before sending the Key.

* Add interface to SftpFile #120 (#812)

* Create ISftpFile interface. SftpFile sealed. Return ISftpFile from SftpClient instead of SftpFile. Make ISftpClient interface disposable.

Co-authored-by: Wojciech Swieboda <[email protected]>

* Start MessageListener with ThreadAbstraction.ExecuteThreadLongRunning (#902)

* Fix Thread pool exhaustion due to MessageListener running on ThreadPool
* Mark long running thread as background

* Add async support to SftpClient and SftpFileStream (#819)

* Add FEATURE_TAP and net472 target
* Add TAP async support to SftpClient and SftpFileStream
* Add async support to DnsAbstraction and SocketAbstraction
* Add async support to *Connector and refactor the hierarchy
* Add ConnectAsync to BaseClient

* Add CODEOWNERS file.

* Fix virus false-positive by Defender on Renci.SSHNet.Tests.dll (#867)

Co-authored-by: Pedro Fonseca <[email protected]>

* Add unit tests for task-based asynchronous API (#906)

* Fix runtime and culture dependant tests.
* Set C# 7.3 in Tests.csproj to limit intellisense's suggestions under different targets
* Add SftpClientTest.*Async
* Add SftpFileStreamTest_OpenAsync_*
* Add SftpFileStreamTest_WriteAsync_*
* Add SftpFileStreamTest_ReadAsync_*
* Align AppVeyor script with Test project target frameworks

* correct 'Documenation' to 'Documentation' (#838)

in the documentation's window title

* Agent auth and Keygen (#794)

* Allow to set PrivateKeyFile Key directly
   So you can add your own Key-Classes to SSH.NET
* Add ED25519 ctor for just pub key part.
* Make ECDSA Key Bits accessible
   You cant export imported CngKeys. To be able to export them to agent or Key-Files make the private bits also accessible.
* Better NETFRAMEWORK vs NETSTANDARD handling
* Add Comment Property to Key
* Add IPrivateKeySource
  So Extension can add own PrivateKeyFiles, e.g. PuttyKeyFile.

* Use cryptographically secure random number generator.
Fixes CVE-2022-29245.

* Remove unused import.

* Add IBaseClient for BaseClient and ISftpClient to inherit from (#975)

Add IBaseClient for BaseClient and ISftpClient to inherit from

* fix typo (#999)

* Fix Seek Operations in SftpFileStream (#910)

* Fix offset operations in SftpFileStream.Seek
* Fix seek exception message and add default case for invalid seek origin
* Use named params when throwing ArgumentException
* Add tests for seeking from end of file

* Add back copyright to license. (#1060)

Fixes #1059.

* Removing old target frameworks (#1109)

Remove support for legacy / deprecated target frameworks while adding support for .NET 6.0 (and higher).
The supported target frameworks are now:
* .NETFramework 4.6.2 (and higher)
* .NET Standard 2.0
* .NET 6.0 (and higher)

* Remove old features [Part 1] (#1117)

Remove obsolete feature switches (now that we've remove support for legacy target frameworks) and remove corresponding conditional code.

* Remove FEATURE_DIRECTORYINFO_ENUMERATEFILES (#1119)

* Remove FEATURE_DIRECTORYINFO_ENUMERATEFILES
* Add exception documentation

* Fix some (lots of) issues reported by analyzers. (#1125)

Fix some (lots of) issues reported by analyzers.

* Round 2 of analyzer fixes and general cleanup. (#1132)

* Analyzer fixes round 3. (#1135)

* Replace Array<T>.Empty with Array.Empty<T>() (#1137)

* Replace IsNullOrWhiteSpace extension (#1142)

* Use License Expression for NuGet Package

licenseUrl is deprecated, see NuGet/Announcements#32

* Integration tests

* Remove todos

* Update CODEOWNERS

* Use correct SSH.NET

* ListDirectoryAsync return IAsyncEnumerable (#1126)

* ListDirectoryAsync return IAsyncEnumerable

* Fix documentation

* Update README.md

* Fix

* Add Sftp ListDirectoryAsync test

* Revert

* Integration tests for ListDirectoryAsync with IAsyncEnumerable

* Fix the assembly resolution build warning (#1165)

* Delete performance/longrunning tests (#1143)

Co-authored-by: Wojciech Nagórski <[email protected]>

* Move Integration tests (#1173)

* Renci.SshNet.IntegrationTests

* Renci.SshNet.TestTools.OpenSSH

* Move integration tests to main repo

* Move old tests to new integration tests

* Move old integration tests to new integration tests

* Move more tests

* Move authentication tests

* Move SshClientTests

* Fix some tests

* Remove duplicated test

* Poc of ProcessDisruptor

* Rename

* Some fixes

* Remove performance tests

* Small improvements

* Add a benchmarks project (#1151)

* Add a benchmarks project

* Small improvements

---------

Co-authored-by: Wojciech Nagórski <[email protected]>

* Use ExceptionDispatchInfo to retain call stack in Session.WaitOnHandle() (#936)

* Use ExceptionDispatchInfo to retain call stack in Session.WaitOnHandle()

* merge

* Update src/Renci.SshNet/Session.cs

Co-authored-by: Rob Hague <[email protected]>

---------

Co-authored-by: Wojciech Nagórski <[email protected]>
Co-authored-by: Rob Hague <[email protected]>

* Support SHA256 fingerprints for host key validation (#1098)

* Add tests for HostKeyEventArgs

* Add SHA256 fingerprint support

* Add support for RSA SHA-2 public key algorithms (#1177)

* Abstract out the hash algorithm from RsaDigitalSignature

* Add integration tests

* Add DigitalSignature property to KeyHostAlgorithm

* Add IHostAlgorithmsProvider interface

* Verify the host signature

* Fix HostKeyEventArgsTest after merge

* Remove PubkeyAcceptedAlgorithms ssh-rsa

* Add test coverage for RSA keys in PrivateKeyFile

* Obsolete IPrivateKeySource

---------

Co-authored-by: Wojciech Nagórski <[email protected]>

* Improvements after #1177 (#1180)

* Use ExceptionDispatchInfo in more places (#1182)

Co-authored-by: Wojciech Nagórski <[email protected]>

* Try to "fix" the flaky test (#1185)

* Enable DSA tests (#1181)

Co-authored-by: Wojciech Nagórski <[email protected]>

* FingerPrints (#1186)

* Use OS-agnostic socket error codes to allow tests run on different OSes (#1179)

SocketErrorCode is OS agnostic, ErrorCode is OS specific.

On Windows ErrorCode = (int) SocketErrorCode, but on Mac and Unix it is not.

For example ExitCode for HostNotFound (11001) on Windows is 11001, on Mac & Unix is -131073. So testing for ExitCode == 11001 fails on Mac & Unix.

Co-authored-by: Wojciech Nagórski <[email protected]>

* Fix for channel session semaphore from thread blocking (#1071)

* Merging fix from @clivetong into our own SSH.NET fork
- The following article describes some of the issues with the double check lock that we have seen issues with: https://www.sudhanshutheone.com/posts/double-check-lock-csharp

* Merging fix from @clivetong into our own SSH.NET fork
- The following article describes some of the issues with the double check lock that we have seen issues with: https://www.sudhanshutheone.com/posts/double-check-lock-csharp

* Update Channel to fix AppVeyor failure (field should be readonly)

* Update ISftpClient for #120 (#1193)

* Implement set last write and access time (#1194)

* Add/migrate hmac+cipher integration tests (#1189)

* Add/migrate hmac+cipher integration tests

* fix integration tests

---------

Co-authored-by: Wojciech Nagórski <[email protected]>

* Update tests for SetLastAccessTime(Utc) to also verify the time component and the Kind of the DateTime value returned by GetLastAccessTime(Utc). (#1198)

---------

Co-authored-by: Filippo Gualandi <[email protected]>
Co-authored-by: 103filgualan <[email protected]>
Co-authored-by: Stefan Rinkes <[email protected]>
Co-authored-by: wxtsxt <[email protected]>
Co-authored-by: Wojciech Swieboda <[email protected]>
Co-authored-by: Igor Milavec <[email protected]>
Co-authored-by: drieseng <[email protected]>
Co-authored-by: Pedro Fonseca <[email protected]>
Co-authored-by: Pedro Fonseca <[email protected]>
Co-authored-by: Maximiliano Jabase <[email protected]>
Co-authored-by: Owen Krueger <[email protected]>
Co-authored-by: Masuri <[email protected]>
Co-authored-by: LemonPi314 <[email protected]>
Co-authored-by: Gert Driesen <[email protected]>
Co-authored-by: Rob Hague <[email protected]>
Co-authored-by: Rob Hague <[email protected]>
Co-authored-by: Marius Thesing <[email protected]>
Co-authored-by: Dāvis Mošenkovs <[email protected]>
Co-authored-by: Dmitry Tsarevich <[email protected]>
Co-authored-by: Patrick Yates <[email protected]>

* Remove code examples

---------

Co-authored-by: Filippo Gualandi <[email protected]>
Co-authored-by: 103filgualan <[email protected]>
Co-authored-by: Stefan Rinkes <[email protected]>
Co-authored-by: wxtsxt <[email protected]>
Co-authored-by: Wojciech Swieboda <[email protected]>
Co-authored-by: Igor Milavec <[email protected]>
Co-authored-by: drieseng <[email protected]>
Co-authored-by: Pedro Fonseca <[email protected]>
Co-authored-by: Pedro Fonseca <[email protected]>
Co-authored-by: Maximiliano Jabase <[email protected]>
Co-authored-by: Owen Krueger <[email protected]>
Co-authored-by: Masuri <[email protected]>
Co-authored-by: LemonPi314 <[email protected]>
Co-authored-by: Gert Driesen <[email protected]>
Co-authored-by: Rob Hague <[email protected]>
Co-authored-by: Rob Hague <[email protected]>
Co-authored-by: Marius Thesing <[email protected]>
Co-authored-by: Dāvis Mošenkovs <[email protected]>
Co-authored-by: Dmitry Tsarevich <[email protected]>
Co-authored-by: Patrick Yates <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add support for a Task based async API