Version 2012 R1: New multi-file methods and common API for SFTP & FTP, faster Blowfish & Twofish

It has been a while since the previous release, but we are sure the delay was worth it: In the meantime, we completely revamped our buildsystem and finally switched to a distributed source control system, which will make it possible to release new versions more often in the future. So what's new in this long-awaited release?

Why we renamed the DLLs

We found out that the DLL naming scheme we decided to use back in 2003 was no longer sustainable and decided to change it. Instead of Rebex.Net.Ssh.dll, Rebex.Net.SecureSocket.dll, Rebex.Net.ProxySocket.dll and Rebex.Security.dll, we now have Rebex.Common.dll and Rebex.Networking.dll. Most of the other DLLs were renamed as well during the process (Rebex.Net.Ftp.dll became Rebex.Ftp.dll, for example). We are sorry for any inconvenience this may have caused, but an alternative solution - introduction of a new DLL for shared functionality - would not be hassle-free either. Fortunately, in order to upgrade to the new version, most customers will only need to remove references to the old DLLs and add references to the new ones because the API is still backward-compatible.

New multi-file methods in Rebex SFTP and FTP/SSL

FTP/SSL and SFTP got several new methods: Upload, Download, Delete and GetItems. The first two are replacements for PutFiles/GetFiles (and support move operation in addition to copy), Delete makes it possible to delete multiple files (or even a directory tree) at once and GetItems makes it possible to retrieve a list of files for the whole directory tree in one call.

Common API for SFTP and FTP/SSL (experimental)

Lot of our customers have been asking for a common API capable of both SFTP and FTP/SSL. Even though Ftp and Sftp objects provide a very similar API, they are still two distinct classes and writing code that can use either of them was hard. Now, it got much better with the introduction of IFtp interface.

Faster Blowfish and Twofish algorithms for Rebex SFTP and Rebex SSH Shell

Bruce Schneier's Blowfish and Twofish symmetric encryption algorithms are a popular choice for SSH communication encryption. Although we have been already supporting both for a few years, we developed a new managed implementation that is substantially faster than the old one.

Compatibility enhancements in Rebex Secure Mail

We are constantly improving our mail writers and parsers to be as compatible with third-party software as possible. In this version, we added support for some embedded OLE objects in TNEF/winmail.dat e-mails (they are parsed as attachments) and enhanced our PKCS #7 (S/MIME) writer which used to have some compatibility issues with Entrust CSP. Many workarounds for badly structured messages were added as well. Rebex Secure Mail is now more compatible than ever.

Support for Time and Daytime protocols in Rebex Time

Although SNTP is a very useful protocol, it runs on top of UDP protocol which is not always available. We added support for Time and Daytime protocols which run over TCP. They don't offer the precision of SNTP, but can be useful if SNTP is simply not an option.

Complete list of changes is huge this time:
  • All: Fixed a bug in TraceLogWriter that caused an additional newline to be written at the end of each message.
  • All: Added FileSystemItem and FileSystemItemCollection classes.
  • All: Better readability in Verbose-level logs.
  • All: Thread ID added to all log messages.
  • FTP/SSL: Added a workaround for GlobalScape servers that used to ignore the last packet in some circumstances.
  • FTP: Auto-resume capability added for PutFiles/GetFiles methods.
  • FTP: Fixed a bug in handling some NOOP responses.
  • FTP: DoNotDetectFeatures option now turns off server feature detection completely, not only the one using the FEAT command.
  • FTP: Fixed a bug in PutFiles method that caused incorrect behavior when a root-based masked path was specified.
  • FTP: Better GlobalScape server detection.
  • FTP: Ftp.GetFile called with non-zeru localOffset creates the local file if it doesn't exists.
  • FTP: String comparison methods use StringComparison.Ordinal.
  • FTP: GetList/GetRawList methods log the list content at Debug log level.
  • FTP: Added workaround to GetFiles method for servers that return full paths in file listings.
  • FTP: New values related to Upload, Download, Delete and GetItems methods added to FtpBatchTransferOperation enum.
  • FTP: Added a workaround for servers that append a dot to their SIZE response.
  • FTP: Fixed date parsing in 24h DOS-like file listings.
  • FTP: Fixed problems with synchronization when EnableMultipleBlockingCalls option is enabled.
  • FTP: FTP no longer attempts to resume TLS/SSL session for data connection when TlsOptions.DoNotCacheSessions option is used.
  • FTP: New Download, Upload, Delete and GetItems methods added to Ftp object (along with associated enums and classes).
  • FTP: Added Ftp.Settings property that replaces and extends Ftp.Options.
  • IMAP: Compatibility enhancements in GSSAPI authentication.
  • IMAP: Added workaround for servers that report IMAP keywords as 'permanent' but not 'supported'.
  • IMAP: ImapMessageCollection implements IList .
  • IMAP: Added new overloads of Imap.StoreMessage and Imap.StoreMessage that accept keywords.
  • IMAP: Fixed a bug that caused notifications to not be fired during IDLE state (Imap.CheckForUpdates method).
  • IMAP: Fixed a bug in the Login method that caused changed capabilities to be detected incorrectly on some servers.
  • IMAP: Stream-based variant of Imap.GetMessagePart method added (the output stream receives data on-the-fly).
  • IMAP: When retrieving message structure info, MIME-encoded filenames are properly decoded.
  • IMAP: ClearText password replaced with asterisk characters in debug log.
  • IMAP: Imap.CopyMessage and Imap.Purge methods return a list of affected messages if the server supports UIDPLUS extension.
  • IMAP: Imap.GetMessageList called on an empty folder now sends a NOOP command to check for recently-arrived messages.
  • IMAP: Fixed a bug in message structure parser that caused an error if an empty ContentId header is encountered.
  • IMAP: Added workaround for 'disappeared messages' during long GetMessageList(Body) calls.
  • MIME: MimeHeaderCollection.GetAllHeaders and GetAllHeaderValuesRaw methods added.
  • MIME: MailMessage.ReceivedDate added. Extracts the date from the topmost 'Received' header.
  • MIME: Addes support for embedded OLE objects in TNEF/winmail.dat e-mails (they are parsed as attachments).
  • MIME: Added workaround for broken TNEF/winamil.dat messages with CRLF suffix.
  • MIME: Fixed a parser error while parsing inner MIME entities with missing headers.
  • MIME: Removed bad character check for TNEF/winmail.dat message embedded attachments.
  • MIME: Fixed a bug that caused problems creating MIME messages with large binary attachments.
  • MIME: Added workaround for date headers with 'negative' hour parts.
  • MIME: Attachment.GetContentStream() no longer removes the BOM header from text attachments.
  • MIME: Added a workaround for broken messages with colon in a MIME parameter (replaced with an underscore).
  • MIME: PKCS #7 attachments are only parsed if they appear to be an actual embedded message.
  • MIME: Added workaround for incomplete Q-encoded header sections.
  • MIME: Added MailDateTime.OriginalTime that returns the date in its original time zone.
  • MIME: Added workaround for broken MIME-encoded headers with unencoded quotes inside.
  • MSG: Compatibility enhancements in MSG reader.
  • MSG: Additional .MSG-only properties are persisted when MimeOptions.LoadMsgProperties option is specified.
  • MSG: Fixed a bug in MSG message writer that caused the messages to be not sendable from Outook.
  • MSG: Enhanced linked resource detection in MSG writer.
  • MSG: Fixed a problem in handling binary data embedded in RTF body parts.
  • MSG: Support for Application specific OLE attachments added to MSG reader.
  • Networking: Socket.NoDelay is used by default in non-CF version of Rebex components.
  • POP3: Fixed argument handling in Login(GssApiProvider) method.
  • POP3: Compatibility enhancements in GSSAPI authentication.
  • POP3: Pop3MessageCollection implements IList .
  • S/MIME: Fixed a bug in the process of searching for a suitable decryption certificate.
  • S/MIME: PFX/P12-based CertificateFinder now supports identification by Subject Key Identifier for certificates with no explicit SKI.
  • Security: Faster Blowfish and Twofish algorithms.
  • Security: SubjectPublicKeyInfo.Load method now supports binary keys.
  • Security: Removed lots of CryptoApi dependencies from Certificate code.
  • Security: 4096-bit DSA keys (used by some SSH servers) are no longer rejected.
  • Security: Diffie-Hellman and DSA algorithms fall back to managed ModPow calculation on .NET CF with missing "Enhanced DSA and Diffie-Hellman" CSPs.
  • Security: Added Certificate.Associate(PrivateKeyInfo) method.
  • Security: Certificates associated with a private key using Associate method now support MD5SHA1 hash algoritm and suitable for TLS/SSL client certificate authentication.
  • Security: Certificate.Save and Certificate.SavePrivateKey methods added, along with a corresponding variant of Certificate.LoadDerWithKey.
  • Security: PKCS #7 writer changed to use a more compatible variant of EncryptedContent in EncryptedContentInfo structure. This solves interoperability issues with Entrust CSP and signed messages.
  • Security: Added ObjectIdentifier.ToArray(bool useDer) method.
  • Security: CertificateChain.LoadP7b method added (used for loading .P7B certificate chains).
  • SFTP: Auto-resume capability added for PutFiles/GetFiles methods.
  • SFTP: Added workarounds for another SFTP server where SSH _FXP _STAT and SSH _FXP _REALPATH commands (used by many Rebex SFTP methods) don't always work (for aliased directories, for example).
  • SFTP: Added workaround for ChangeDirectory problems with WS _FTP server.
  • SFTP: OpenSSH on a Unix-like OS is now detected properly.
  • SFTP: Fixed a bug in PutFiles method that caused incorrect behavior when a root-based masked path was specified.
  • SFTP: Changing Sftp's or Scp's LogWriter now changes the underlying SshSession's LogWriter as well.
  • SFTP: Added SftpOptions.UseSmallPackets option that reportedly solves speed issues in some rare circumstances.
  • SFTP: It's now possible to call Sftp.Login again if it fails.
  • SFTP: Added TryPasswordFirst option to try "password" authentication first and "publickey" later (by default, the opposite order is used).
  • SFTP: New values related to Upload, Download, Delete and GetItems methods added to SftpBatchTransferOperation enum.
  • SFTP: String comparison methods use StringComparison.Ordinal.
  • SFTP: New Download, Upload, Delete and GetItems methods added to Sftp object (along with associated enums and classes).
  • SFTP: Added Sftp.Settings property that replaces and extends Sftp.Options.
  • SMTP/SSL: Added SmtpExtensions.ExplicitSecurity to make it possible to determine whether the server supports explicit TLS/SSL.
  • SMTP: Compatibility enhancements in GSSAPI authentication.
  • SMTP: Fixed Smtp.Send to report a proper exception when trying to send a signed message with 8bit or binary MIME entities through a server that doesn't support 8BITMIME or BINARY extensions.
  • SMTP: Fixed a bug in legacy SMTP message sending mode that might have occasionally cause a timeout.
  • SSH Core: Added SshParameters.PreferredHostKeyAlgorithm property.
  • SSH Core: Added SshChannel.PassEnvironmentVariable method.
  • SSH Core: Fixed NullReferenceException during simultaneous channel close/read.
  • SSH Core: Fixed a deadlock that may have occured when using multiple SSH channels from multiple threads.
  • SSH Core: Fixed a race condition that may have occured when sending and reading from a single SSH channel at the same time.
  • SSH Core: Removed SshParameters.Options property because it was ignored and only present by mistake.
  • SSH Core: Added SshParameters.SetEncryptionAlgorithms method to specify exact list and order of allowed SSH ciphers. Corresponding GetEncryptionAlgorithms method added as well.
  • SSH Shell: Changing Ssh's LogWriter now changes the underlying SshSession's LogWriter as well.
  • Ssh: Fixed error handling in SshSession.OpenTcpIpTunnel method that caused troubles when multiple channels were active at the same time.
  • Ssh: SshChannel no longer attempts to adjust window size after the channel has been closed.
  • Ssl: Fixed non-working TlsSocket.BeginSend and BeginReceive methods.
  • Telnet: Setting Telnet.LogWriter applies to existing TelnetChannel instances as well.
  • Telnet: Better error handling in TelnetTerminalControl.Connect method.
  • Terminal: Added TerminalControl.MouseSelectionCopiesToClipboard property.
  • Terminal: Added TerminalControl.SelectionChanged event.
  • Terminal: TerminalControl now works in Linux under Mono.
  • Terminal: Added TerminalCell.Blink property.
  • Terminal: Oversized scroll region escape sequences are now clipped instead of ignored.
  • Terminal: Fixed processing of CSI escape sequences with Extended Leading Intermediate.
  • Terminal: Added FunctionKeys.Escape and FunctionKeys.Backspace to simplify sending these keys using TerminalControl's or VirtualTerminal's SendToServer method.
  • Terminal: Added Disconnected event to VirtualTerminal
  • Terminal: ProcessingError event is correctly called when an error occured while in automatic processing mode.
  • Time: Added support for TIME and DAYTIME protocols.
  • ZIP: Added multi-file support to GzipCompressionStream and GzipDecompressionStream.
  • ZIP: Better detection of the need to use Zip64 extension for long streams.
  • ZIP: Added ZipArchive.GetItemsAsync method.
  • ZIP: New values related to Add, Extract, Delete and GetItems methods added to ArchiveOperationStep enum.
  • ZIP: Default charset changed to IBM437 (used to be Encoding.Default).
  • ZIP: The Rebex.IO.Compression.FileSet class was moved to Rebex.IO.Compression.Legacy namespace. The Rebex.IO.FileSet class is intended to be used instead.