﻿<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
	<channel>
		<title>using Rebex.Net;</title>
		<link>https://blog.rebex.net/</link>
		<description>// News, tips &amp; tricks from Rebex developers</description>
		<copyright>2026</copyright>
		<pubDate>Tue, 11 Aug 2026 17:03:53 GMT</pubDate>
		<lastBuildDate>Tue, 11 Aug 2026 17:03:53 GMT</lastBuildDate>
		<item>
			<title>SFTP test server options for .NET developers</title>
			<link>https://blog.rebex.net/sftp-server-for-testing</link>
			<description>Picking an SFTP test server for your .NET app - public, local or scriptable, and most options are free even for commercial work.</description>
			<author>Martin Vobr</author>
			<guid>https://blog.rebex.net/sftp-server-for-testing</guid>
			<pubDate>Tue, 11 Aug 2026 12:00:00 GMT</pubDate>
			<content:encoded>&lt;!--
## Where do I point my SFTP client? Setting up a test environment for Rebex SFTP .NET library
--&gt;
&lt;h2 id="where-do-i-point-my-sftp-client-while-testing"&gt;Where do I point my SFTP client while testing?&lt;/h2&gt;
&lt;p&gt;You've added &lt;a href="https://www.rebex.net/sftp.net/"&gt;Rebex SFTP&lt;/a&gt; to your project, written the first &lt;code&gt;Sftp.Connect()&lt;/code&gt; / &lt;code&gt;Login&lt;/code&gt; / &lt;code&gt;Upload()&lt;/code&gt; / &lt;code&gt;Download()&lt;/code&gt; sequence, and now you need something on the other end of the wire. Preferably something you can break, restart, and fill with junk files without anybody noticing.&lt;/p&gt;
&lt;p&gt;This post walks through some options, from &amp;quot;you already have one&amp;quot; to &amp;quot;spin up a fresh server per test run&amp;quot;, with the trade-offs of each.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="option-1-the-sftp-server-you-already-have"&gt;Option 1: The SFTP server you already have&lt;/h2&gt;
&lt;p&gt;If your organization already runs an SFTP server - OpenSSH on a Linux box, a vendor appliance, whatever - the fastest path is to get a test account on it and move on. Nothing to install, nothing to explain to anyone.&lt;/p&gt;
&lt;p&gt;It works, but be aware of what you're signing up for:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shared state.&lt;/strong&gt; Someone else's test run deletes the directory yours depends on. Test ordering suddenly matters.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You don't control the config.&lt;/strong&gt; Want to check how your code behaves with a different key exchange algorithm, an expired host key, or a server that rejects &lt;code&gt;SSH_FXP_RENAME&lt;/code&gt;? You'll be filing a ticket with whoever owns the box.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It's not there when you are.&lt;/strong&gt; Working on the train, on a plane, or from a coffee shop with a captive-portal Wi-Fi means no tests.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reset is manual.&lt;/strong&gt; No easy way to say &amp;quot;put the filesystem back the way it was&amp;quot; between test runs.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI is awkward.&lt;/strong&gt; Your build agents now need network access and credentials to a real server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Fine for a smoke test. Might be painful as the backbone of an automated test suite.&lt;/p&gt;
&lt;h2 id="option-2-test.rebex.net-zero-setup-read-only"&gt;Option 2: test.rebex.net - zero setup, read-only&lt;/h2&gt;
&lt;p&gt;We run a public test server at &lt;strong&gt;&lt;a href="https://test.rebex.net"&gt;test.rebex.net&lt;/a&gt;&lt;/strong&gt;. Credentials, ports and the list of supported protocols are on that page - SFTP is on port 22, and the login is the usual &lt;code&gt;demo&lt;/code&gt; / &lt;code&gt;password&lt;/code&gt; combination.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;var client = new Sftp();
client.Connect(&amp;quot;test.rebex.net&amp;quot;, 22);
client.Login(&amp;quot;demo&amp;quot;, &amp;quot;password&amp;quot;);

foreach (var item in client.GetList(&amp;quot;/&amp;quot;))
    Console.WriteLine(item.Name);

client.Disconnect();
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That's a working SFTP session in under a minute, which is exactly what it's for: confirming your connection code, your credentials handling, and your fingerprint verification logic actually do something before you go hunting for bugs elsewhere.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Limitations you need to know about:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;It's read-only.&lt;/strong&gt; You cannot upload, delete or rename anything. Half of what you probably want to test is off the table.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It's shared and rate-limited.&lt;/strong&gt; Please don't point a CI pipeline at it. It's a courtesy service, not infrastructure.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;It's remote.&lt;/strong&gt; Same offline problem as option 1.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Use it to answer &amp;quot;does my code speak SFTP at all?&amp;quot; Then move to something local.&lt;/p&gt;
&lt;h2 id="option-3-rebex-tiny-sftp-server-unzip-click-start"&gt;Option 3: Rebex Tiny SFTP Server - unzip, click Start&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.rebex.net/tiny-sftp-server/"&gt;Rebex Tiny SFTP Server&lt;/a&gt; is a minimalist single-user SFTP server for Windows. It started life as a sample application for the &lt;a href="https://www.rebex.net/file-server/"&gt;Rebex File Server&lt;/a&gt; library and turned out to be useful enough on its own that we ship it as a standalone download.&lt;/p&gt;
&lt;p&gt;The workflow is about as simple as it gets: download the ZIP, unpack it, run &lt;code&gt;RebexTinySftpServer.exe&lt;/code&gt;, press &lt;strong&gt;Start&lt;/strong&gt;. You now have an SFTP server on localhost serving a directory of your choice, with full read/write access.&lt;/p&gt;
&lt;p&gt;Configuration lives in &lt;code&gt;RebexTinySftpServer.exe.config&lt;/code&gt; - plain XML, where you set the port, the user name and password, and the root directory.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Licensing:&lt;/strong&gt; running the pre-built binary is free, for commercial and non-commercial use alike. No strings.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Where it falls short:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It's a &lt;strong&gt;GUI application&lt;/strong&gt;. You start and stop it by hand. There's no service mode and no command-line control, so wiring it into an automated pipeline means either leaving it running permanently or scripting a window.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Single user.&lt;/strong&gt; Testing permission boundaries between accounts isn't possible.&lt;/li&gt;
&lt;li&gt;Changing the configuration means editing XML and restarting the app.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Perfect for interactive development: leave it running in the background on your dev box and hammer it from the debugger.&lt;/p&gt;
&lt;h2 id="option-4-rebex-file-server.net-library-run-the-server-in-process"&gt;Option 4: Rebex File Server .NET library - run the server in-process&lt;/h2&gt;
&lt;p&gt;Tiny SFTP Server is not magic. Under the hood it's a thin GUI wrapped around the &lt;a href="https://www.rebex.net/file-server/"&gt;Rebex File Server&lt;/a&gt; library - and if you already own the library, you can skip the wrapper entirely and start the server from inside your own test process.&lt;/p&gt;
&lt;p&gt;Setup is a handful of lines: create a &lt;code&gt;FileServer&lt;/code&gt;, give it a host key and a user, and start it.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// nuget Microsoft.NET.Test.Sdk
// nuget NUnit
// nuget NUnit3TestAdapter
// nuget Rebex.FileServer
// nuget Rebex.Sftp

using System.Net;
using NUnit.Framework;
using Rebex.Net;
using Rebex.Net.Servers;

[TestFixture]
public class SftpTests
{
    private static readonly Lazy&amp;lt;SshPrivateKey&amp;gt; ServerKeyLazy = new(SshPrivateKey.Generate);
    private const string Username = &amp;quot;user01&amp;quot;;
    private const string Password = &amp;quot;password&amp;quot;;

    [Test]
    public async Task Test()
    {
        // prepare
        await using FileServer server = await CreateServer();

        // contains the actual port used by the server
        IPEndPoint serverEndpoint = (IPEndPoint)server.Bindings.First().EndPoint;
        TestContext.WriteLine(&amp;quot;Server endpoint: {0}&amp;quot;, serverEndpoint);

        using Sftp client = new();

        await client.ConnectAsync(serverEndpoint.Address.ToString(), serverEndpoint.Port);
        await client.LoginAsync(Username, Password);

        // test
        Assert.That(client.IsAuthenticated, Is.True);

        await client.DisconnectAsync();
    }

    // CreateServer can be parameterized to customize the testing environment
    private static async Task&amp;lt;FileServer&amp;gt; CreateServer()
    {
        FileServer fs = new();

        try
        {
            // port 0 will instruct the server to use a random, unused port, so the test can be parallelized
            await fs.BindAsync(new IPEndPoint(IPAddress.Loopback, 0), FileServerProtocol.Sftp);
            fs.Keys.Add(ServerKeyLazy.Value);
            fs.Users.Add(Username, Password, Path.GetTempPath());

            await fs.StartAsync();
            return fs;
        }
        catch
        {
            await fs.DisposeAsync();
            throw;
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Why this is attractive for testing:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;No external process, no orchestration.&lt;/strong&gt; No ZIP to unpack on the build agent, no process to launch and reap, no port conflict with something a previous run left behind. &lt;code&gt;dotnet test&lt;/code&gt; is the whole story.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Each test can get its own server.&lt;/strong&gt; Pick a free port, point a temp directory at it, tear it down afterwards. Tests can run in parallel without stepping on each other.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;You can make the server misbehave on purpose.&lt;/strong&gt; This is the real payoff. The library exposes a &lt;a href="https://www.rebex.net/file-server/features/virtual-file-systems.aspx"&gt;virtual file system&lt;/a&gt; you can implement yourself, plus &lt;a href="https://www.rebex.net/file-server/features/events.aspx"&gt;events&lt;/a&gt; for uploads and downloads. That makes it possible to simulate the failures you'd otherwise never reproduce: a read that throws halfway through a large file, a directory with 50,000 entries, filenames with awkward Unicode, a server that drops the connection mid-transfer, permissions that change between two calls. Testing your retry and resume logic against a server that &lt;em&gt;actually&lt;/em&gt; fails beats hoping it works.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Restrict the algorithms.&lt;/strong&gt; Narrow down the supported key exchange and encryption algorithms to check how your client behaves against an old or hardened server.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Where to look for a working example:&lt;/strong&gt; Tiny SFTP Server itself. The source is on GitHub at &lt;a href="https://github.com/rebexnet/RebexTinySftpServer"&gt;github.com/rebexnet/RebexTinySftpServer&lt;/a&gt; - a few hundred readable lines around the &lt;code&gt;FileServer&lt;/code&gt; class, showing key loading, user setup and lifecycle handling. Fork it, strip out the WinForms parts, and you have the skeleton of a test fixture.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Licensing:&lt;/strong&gt; Rebex File Server is a commercial component, sold separately or as part of the &lt;a href="https://www.rebex.net/file-transfer-pack/"&gt;File Transfer Pack&lt;/a&gt; and &lt;a href="https://www.rebex.net/total-pack/"&gt;Total Pack&lt;/a&gt;. A &lt;a href="https://www.rebex.net/support/trial/"&gt;trial key&lt;/a&gt; is enough to find out whether the approach suits you.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The trade-off:&lt;/strong&gt; this is the only option here that costs money if you're building commercially, and it's the one that requires you to write code rather than run an executable. In return you get complete control over the server's behaviour from within your test suite.&lt;/p&gt;
&lt;h2 id="option-5-buru-sftp-server-the-one-you-can-script"&gt;Option 5: Buru SFTP Server - the one you can script&lt;/h2&gt;
&lt;p&gt;When you want the same convenience as Tiny SFTP Server but with automation, use &lt;a href="https://www.rebex.net/buru-sftp-server/"&gt;Buru SFTP Server&lt;/a&gt;. It's a full SFTP/FTP/SSH server for Windows, and it happens to be the same core that powers test.rebex.net - so behaviour you see locally matches what you saw online.&lt;/p&gt;
&lt;p&gt;Two things make it a good fit for testing.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;First, it runs portable.&lt;/strong&gt; There's a &lt;a href="https://www.rebex.net/buru-sftp-server/features/platforms/portable/"&gt;portable mode&lt;/a&gt; - download the Portable ZIP, unpack, and run it as a normal console application from any folder, USB stick, or network drive. No installer, no admin rights, no leftover Windows service. (It &lt;em&gt;can&lt;/em&gt; run as a service when you want it to; you're just not forced into it.)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Second, everything can be driven from the command line.&lt;/strong&gt; Creating an instance, adding users, starting the server:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-bash"&gt;# initialize an instance in the current directory
burusftp init

# add a user
burusftp user add john --password mypassword --root-dir &amp;quot;C:\temp\sftp-test-root&amp;quot;

# run the server
burusftp run
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Which means your test fixture can do this:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Copy a clean instance directory into a temp folder (or run &lt;code&gt;burusftp init&lt;/code&gt; fresh).&lt;/li&gt;
&lt;li&gt;Add exactly the users your test needs, with exactly the root directories and permissions it needs.&lt;/li&gt;
&lt;li&gt;Start the server on a free port.&lt;/li&gt;
&lt;li&gt;Run the tests.&lt;/li&gt;
&lt;li&gt;Kill the process and delete the folder.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Every run starts from a known state. No shared server, no leftover files from yesterday, no &amp;quot;works on my machine&amp;quot;.&lt;/p&gt;
&lt;p&gt;The configuration is a &lt;strong&gt;text file in YAML format&lt;/strong&gt;, so you can keep a set of purpose-built configs in your repository next to the tests that use them - one that only allows a weak set of algorithms, one with a tiny transfer limit, one with a specific host key. Diffable, reviewable, versioned.&lt;/p&gt;
&lt;p&gt;It also serves &lt;strong&gt;FTP, FTP/S and SSH shell&lt;/strong&gt;, which is handy if your application talks more than one protocol and you'd rather not run three different test servers.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Licensing:&lt;/strong&gt; free for non-commercial use; see &lt;a href="https://www.rebex.net/buru-sftp-server/editions/"&gt;pricing&lt;/a&gt; for the details of what each tier includes.&lt;/p&gt;
&lt;p&gt;This is the option we'd recommend for anything resembling a real test suite.&lt;/p&gt;
&lt;h2 id="option-6-third-party-servers-when-you-need-the-weird-ones"&gt;Option 6: Third-party servers, when you need the weird ones&lt;/h2&gt;
&lt;p&gt;Sooner or later you'll integrate with a server that does something surprising - an unusual path format, a non-standard permission string in directory listings, an SFTP v3 implementation with opinions, a &lt;code&gt;SSH_FXP_STAT&lt;/code&gt; response that omits fields everyone else sends.&lt;/p&gt;
&lt;p&gt;If you want to test against a specific implementation, &lt;a href="https://www.sftp.net/servers"&gt;sftp.net/servers&lt;/a&gt; maintains a list of SFTP server software with notes on each. Pick the one your customer uses, install it locally, and reproduce the problem.&lt;/p&gt;
&lt;p&gt;That said - &lt;strong&gt;you probably don't need to do this as often as you think.&lt;/strong&gt; We run regular regression tests of Rebex SFTP against a large set of third-party server implementations precisely so that this class of incompatibility gets caught on our side rather than yours. If you do hit a server that Rebex SFTP misbehaves against, that's a bug report we want: send us a &lt;a href="https://www.rebex.net/kb/logging/"&gt;communication log&lt;/a&gt; and we'll look at it.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="quick-summary"&gt;Quick summary&lt;/h2&gt;
&lt;table class="table"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;th&gt;Write access&lt;/th&gt;
&lt;th&gt;Automatable&lt;/th&gt;
&lt;th&gt;Offline&lt;/th&gt;
&lt;th&gt;Cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Your own server&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;already done&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;varies&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;–&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://test.rebex.net/"&gt;test.rebex.net&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;none&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;no&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;no (please don't)&lt;/td&gt;
&lt;td&gt;no&lt;/td&gt;
&lt;td&gt;free&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.rebex.net/tiny-sftp-server/"&gt;Tiny SFTP Server&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;unzip + click&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;not really&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;free, incl. commercial use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.rebex.net/file-server/"&gt;File Server&lt;/a&gt; (in-process)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;write a fixture&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;yes, fully&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;commercial license&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://www.rebex.net/buru-sftp-server/"&gt;Buru SFTP Server&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;unzip + 3 commands&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;yes, fully&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;free for non-commercial use&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;&lt;a href="https://sftp.net/servers/"&gt;Third-party servers&lt;/a&gt;&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;varies&lt;/td&gt;
&lt;td&gt;yes&lt;/td&gt;
&lt;td&gt;varies&lt;/td&gt;
&lt;td&gt;varies&lt;/td&gt;
&lt;td&gt;varies&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;A reasonable progression for most projects:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Start with &lt;strong&gt;test.rebex.net&lt;/strong&gt; to prove your connection code works.&lt;/li&gt;
&lt;li&gt;Move to &lt;strong&gt;Tiny SFTP Server&lt;/strong&gt; for day-to-day development against a local, writable server.&lt;/li&gt;
&lt;li&gt;Adopt &lt;strong&gt;Buru SFTP Server&lt;/strong&gt; once you want tests that run unattended from a clean state.&lt;/li&gt;
&lt;li&gt;Host &lt;strong&gt;Rebex File Server in-process&lt;/strong&gt; when you need the server to fail in specific, repeatable ways - or simply want zero moving parts in CI.&lt;/li&gt;
&lt;li&gt;Reach for &lt;strong&gt;specific third-party servers&lt;/strong&gt; only when you're chasing a compatibility issue with a particular implementation.&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;Questions? &lt;a href="https://www.rebex.net/support/"&gt;Rebex support&lt;/a&gt; and the &lt;a href="https://forum.rebex.net/"&gt;forum&lt;/a&gt; are both open.&lt;/em&gt;&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>How to use ML-DSA with Rebex SSH libraries</title>
			<link>https://blog.rebex.net/experimental-ml-dsa-ssh-pqc</link>
			<description>Rebex libraries currently feature experimental support for ML-DSA in pure mode</description>
			<author>Lukas Pokorny</author>
			<guid>https://blog.rebex.net/experimental-ml-dsa-ssh-pqc</guid>
			<pubDate>Fri, 31 Jul 2026 00:00:00 GMT</pubDate>
			<content:encoded>&lt;p&gt;ML-DSA (Module-Lattice-Based Digital Signature Algorithm) is a post-quantum cryptographic signature algorithm
standardized in NIST FIPS 204 that is currently being integrated into the SSH protocol.
ML-DSA is designed to replace traditional digital signature algorithms like RSA and ECDSA for identity verification.
And along with ML-KEM, it protects SSH communication against future decryption threats from cryptographically
relevant quantum computers.&lt;/p&gt;
&lt;p&gt;However, as of summer 2026, while SSH key exchange ciphers based on ML-KEM are already widely implemented and deployed,
the exact details of ML-DSA support in SSH are still work in progress. Lately, there has been
an &lt;a href="https://freenode.net/article/ietf-ssh-group-weighs-pure-vs-hybrid-post-quantum-signatures"&gt;increasingly heated debate&lt;/a&gt;
about whether to use ML-DSA in stand-alone (pure) mode, or whether to go for composite (hybrid) mode instead.
In hybrid mode, ML-DSA is used together with a well-known and battle-tested classic algorithm such RSA, ECDSA or Ed25519.
This ensures that when a vulnerability is discovered in the post-quantum algorithm or its implementation,
the SSH session at least remains protected by the classical algorithm. Others argue this would be overly-complicated,
and would not provide any extra security in the longer term, when ML-DSA implementations mature
or cryptographically relevant quantum computers actually arrive.&lt;/p&gt;
&lt;p&gt;As for Rebex libraries, in order to make it possible to perform some real-world testing, we added experimental support
for stand-alone SSH ML-DSA algorithm to &lt;a href="https://www.rebex.net/total-pack/history.aspx#8.0.9673"&gt;version 8.0 of our SSH-enabled libraries&lt;/a&gt;.
We choose to add support pure mode ML-DSA ciphers first because these have already been available during development
of version 8, and they do seem likely to stay, even if hybrid variants initially become a preferred choice.&lt;/p&gt;
&lt;p&gt;Of course, we plan to add hybrid variants as well, as soon as it becomes clear which of the composites actually gain traction.
Expect more updates soon!&lt;/p&gt;
&lt;p&gt;For now, if you decide to enable experimental ML-DSA support in Rebex SSH libraries and give it a try,
make sure you are aware of the &lt;a href="https://postquantum.com/security-pqc/bernstein-exploiting-mldsa-bugs/"&gt;controversies&lt;/a&gt; surrounding
pure mode ML-DSA and understand the implications.&lt;/p&gt;
&lt;p&gt;Currently, two competing (but &lt;em&gt;almost&lt;/em&gt; compatible) draft specifications of pure SSH ML-DSA exist:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://datatracker.ietf.org/doc/html/draft-sfluhrer-ssh-mldsa-06"&gt;&lt;em&gt;sfluhrer-ssh-mldsa&lt;/em&gt;&lt;/a&gt;,
defines &lt;code&gt;ssh-mldsa-44&lt;/code&gt;, &lt;code&gt;ssh-mldsa-65&lt;/code&gt;, and &lt;code&gt;ssh-mldsa-87&lt;/code&gt; public key and signature formats.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://datatracker.ietf.org/doc/html/draft-rpe-ssh-mldsa-03"&gt;&lt;em&gt;rpe-ssh-mldsa&lt;/em&gt;&lt;/a&gt;
defines &lt;code&gt;mldsa-44&lt;/code&gt;, &lt;code&gt;mldsa-65&lt;/code&gt;, and &lt;code&gt;mldsa-87&lt;/code&gt; instead.&lt;/li&gt;
&lt;li&gt;Confusingly, an earlier version of &lt;em&gt;sfluhrer-ssh-mldsa&lt;/em&gt; defined cipher IDs as &lt;code&gt;ssh-mldsaNN&lt;/code&gt; instead,
while an earlier version of &lt;em&gt;rpe-ssh-mldsa&lt;/em&gt; used &lt;code&gt;ssh-mldsa-NN&lt;/code&gt; form (which is currently used by &lt;em&gt;sfluhrer-ssh-mldsa&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because it is still not clear whether and when any of these are going to become official,
Rebex libraries currently support all these forms. You just have to explicitly enable
the variant you intend to use. Our test server at &lt;a href="https://test.rebex.net/"&gt;test.rebex.net&lt;/a&gt; supports all of them,
but in practice, we really recommend choosing just a single one.&lt;/p&gt;
&lt;p&gt;For example, to try &lt;code&gt;ssh-mldsa-44&lt;/code&gt; host key algorithm with Rebex SFTP (which runs over SSH),
get &lt;a href="https://www.nuget.org/packages/Rebex.Sftp/8.0.9709"&gt;Rebex.Sftp NuGet package&lt;/a&gt; and use the following code:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;var sftp = new Rebex.Net.Sftp();
sftp.LogWriter = new ConsoleLogWriter(LogLevel.Debug);

// only allow 'ML-DSA-44' group of host key algorithms
sftp.Settings.SshParameters.HostKeyAlgorithms = SshHostKeyAlgorithm.MLDsa44;

// explicitly enable 'mldsa-44' host key algorithm only
sftp.Settings.SshParameters.SetHostKeyAlgorithms(&amp;quot;ssh-mldsa-44&amp;quot;);

// connect to an SSH server
sftp.Connect(&amp;quot;test.rebex.net&amp;quot;, 22);

// check server key fingerprint
if (sftp.Fingerprint.ToString() != &amp;quot;D5wjygbqhOAQ8O1chM7Vo1geEuQHuLT9WOgZO0z5cYE&amp;quot;)
{
    throw new Exception(&amp;quot;Warning: Unexpected server key.&amp;quot;);
}

// authenticate and list remote root directory
sftp.Login(&amp;quot;demo&amp;quot;, &amp;quot;password&amp;quot;);
Console.WriteLine(string.Join(&amp;quot;\n&amp;quot;, sftp.GetRawList(&amp;quot;/&amp;quot;)));
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Rebex libraries have been tested with these third-party implementations of pure SSH ML-DSA:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://roumenpetrov.info/secsh/"&gt;PKIX-SSH secure shell&lt;/a&gt;, a fork of OpenSSH that adds X.509 v3 certificate support and other features; implements &lt;code&gt;mldsa-NN&lt;/code&gt; algorithms&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/open-quantum-safe/openssh"&gt;OQS-OpenSSH&lt;/a&gt;, a fork of OpenSSH that adds PQC algorithm support using liboqs for prototyping and evaluation purposes; implements &lt;code&gt;ssh-mldsaNN&lt;/code&gt; algorithms&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Last month, developers taking part in the &lt;a href="https://wiki.ietf.org/en/meeting/126/hackathon"&gt;IETF 126 Hackathon&lt;/a&gt; produced new &lt;em&gt;sfluhrer-ssh-mldsa&lt;/em&gt; implementations:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;yet another &lt;a href="https://github.com/beldmit/openssh-portable/tree/beldmit-f45-103p1-gsshybrids"&gt;OpenSSH fork&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://gitlab.com/pzacik/libssh-mirror/-/commits/draft-sfluhrer-mldsa"&gt;libssh fork&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/ronf/asyncssh/tree/mldsa"&gt;AsyncSSH fork&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have not tested these new forks yet, but we should be compatible with their &lt;code&gt;ssh-mldsa-44&lt;/code&gt;, &lt;code&gt;ssh-mldsa-65&lt;/code&gt; and &lt;code&gt;ssh-mldsa-87&lt;/code&gt;.
If you encounter any issues, let us know!&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;For more information about the 8.0 release and its enhancements, see &lt;a href="https://www.rebex.net/total-pack/history.aspx#8.0.9673"&gt;release highlights&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Rebex .NET libraries 8.0: Quantum-safe security with ML-KEM and ML-DSA, improved TLS and SSH, FIPS 140-3 mode</title>
			<link>https://blog.rebex.net/version-8-0</link>
			<description>This release brings major new features including PQC security, new SSH/SFTP server core, and lot of other enhancements.</description>
			<author>Lukas Pokorny</author>
			<guid>https://blog.rebex.net/version-8-0</guid>
			<pubDate>Thu, 16 Jul 2026 14:00:00 GMT</pubDate>
			<content:encoded>&lt;?# DownloadBox title="Download Rebex .NET libraries"
    url="https://www.rebex.net/total-pack/download/"
    imageUrl="/images/total-pack-m.png"
/?&gt;
&lt;h2 id="first-8.0-release"&gt;First 8.0 release!&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://www.rebex.net/total-pack/history.aspx#8.0.9673"&gt;8.0.9673 release&lt;/a&gt; of Rebex components marks the official launch of the 8.0 series.
The 7.0 series &lt;a href="https://www.rebex.net/kb/library-support-lifecycle/"&gt;remain supported&lt;/a&gt; until June 2027, allowing enough time to upgrade your production workloads.&lt;/p&gt;
&lt;h2 id="quantum-safe-security-ml-kem-and-ml-dsa"&gt;Quantum-safe security: ML-KEM and ML-DSA&lt;/h2&gt;
&lt;p&gt;The threat of &amp;quot;harvest now, decrypt later&amp;quot; makes early adoption of post-quantum cryptography (PQC) essential.
Rebex 8.0 adds support for NIST-standardized PQC algorithms, ML-KEM and ML-DSA to TLS and SSH.&lt;/p&gt;
&lt;p&gt;The &lt;a href="https://www.rebex.net/sftp.net/features/ssh.aspx#ciphers"&gt;SSH library&lt;/a&gt; now supports hybrid key exchange ciphers, combining standard algorithms with quantum-resistant keys:
&lt;code&gt;mlkem768nistp256-sha256&lt;/code&gt;, &lt;code&gt;mlkem1024nistp384-sha384&lt;/code&gt;, and &lt;code&gt;mlkem768x25519-sha256&lt;/code&gt;.
The &lt;a href="https://www.rebex.net/tls/features/tls-ssl.aspx#tls-13-key-exchange-alg"&gt;TLS library&lt;/a&gt; features &lt;code&gt;X25519MLKEM768&lt;/code&gt;, &lt;code&gt;SecP256r1MLKEM768&lt;/code&gt;, and &lt;code&gt;SecP384r1MLKEM1024&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;SSH and TLS also have experimental support for ML-DSA to secure digital signatures against future quantum attacks. S/MIME got ML-DSA support as well.&lt;/p&gt;
&lt;p&gt;PQC algorithms are supported out-of-box on up-to-date &lt;a href="https://techcommunity.microsoft.com/blog/microsoft-security-blog/post-quantum-cryptography-apis-now-generally-available-on-microsoft-platforms/4469093"&gt;PQC-enabled Windows&lt;/a&gt;
with .NET Framework 3.5/4.x or .NET 5 to 10. On other platforms, a &lt;a href="https://www.rebex.net/kb/pqc-plugins/"&gt;PQC plugin&lt;/a&gt; is needed.&lt;/p&gt;
&lt;h2 id="new-sshsftp-server-core"&gt;New SSH/SFTP server core&lt;/h2&gt;
&lt;p&gt;Thread consumption can stall high-throughput servers. Version 8.0 of &lt;a href="https://www.rebex.net/file-server/"&gt;Rebex File Server library&lt;/a&gt; addresses this bottleneck with an architectural overhaul,
and introduces a new fully asynchronous SSH and SFTP core.
This reduces overall thread allocation and maximizes scalability under parallel loads. The asynchronous transition extends to authentication and other events as well.&lt;/p&gt;
&lt;p&gt;The new SFTP core also supports the &lt;code&gt;copy-data&lt;/code&gt; extension that facilitates server-side file copying.&lt;/p&gt;
&lt;h2 id="ftp-server-support"&gt;FTP server support&lt;/h2&gt;
&lt;p&gt;Need FTP protocol support for communication with legacy systems?
There is no need to run detached server software any more because Rebex File Server adds &lt;a href="https://www.rebex.net/file-server/features/ftp.aspx"&gt;server-side FTP and FTPS&lt;/a&gt; to its capabilities.
It can secure FTP traffic with TLS 1.3 or 1.2, but can still be configured for legacy plain FTP as well to maintain integration with aging internal systems and legacy devices.&lt;/p&gt;
&lt;h2 id="updated-smime-security"&gt;Updated S/MIME security&lt;/h2&gt;
&lt;p&gt;Rebex &lt;a href="https://www.rebex.net/mail-pack/features/s-mime.aspx"&gt;S/MIME API&lt;/a&gt; got support for additional signature algorithms: post-quantum ML-DSA, ECDSA, and Ed25519.
It also got support for AEAD symmetric encryption ciphers: AES/GCM and ChaCha20/Poly1305.&lt;/p&gt;
&lt;h2 id="more-tls-features"&gt;More TLS features&lt;/h2&gt;
&lt;p&gt;Brainpool curves are now supported in TLS 1.3 as well. Client-side OCSP stapling support is another improvement, which improves the performance and privacy of certificate revocation checking
by allowing the server to send a signed OCSP response during the TLS handshake, eliminating the need for the client to contact the certificate authority directly.&lt;/p&gt;
&lt;h2 id="fips-140-3-mode-and-cryptography-updates"&gt;FIPS 140-3 mode and cryptography updates&lt;/h2&gt;
&lt;p&gt;Instead of FIPS 140-2, the &lt;code&gt;UseFipsAlgorithmsOnly&lt;/code&gt; setting now enables &lt;em&gt;FIPS 140-3 mode&lt;/em&gt;, which limits usage of cryptographic algorithms, and forces usage of cryptographic modules to those provided by .NET or the operating system.
We also migrated from the legacy CryptoAPI to the new Windows CNG API.
Additionally, HKDF key derivation in XtsStream and FileEncryption classes has been updated to support SHA-2 family of hashes.&lt;/p&gt;
&lt;h2 id="new-http-client-core"&gt;New HTTP client core&lt;/h2&gt;
&lt;p&gt;Rebex &lt;a href="https://www.rebex.net/https/"&gt;HTTPS&lt;/a&gt;, &lt;a href="https://www.rebex.net/graph/"&gt;Graph&lt;/a&gt;, &lt;a href="https://www.rebex.net/ews/"&gt;EWS&lt;/a&gt; and &lt;a href="https://www.rebex.net/websocket/"&gt;WebSocket&lt;/a&gt; libraries feature a new HTTP client core
that has been upgraded to fully asynchronous mode, making it less thread-hungry and more scalable.&lt;/p&gt;
&lt;h2 id="terminal-control-improvements"&gt;Terminal control improvements&lt;/h2&gt;
&lt;p&gt;The new version of &lt;a href="https://www.rebex.net/ssh-shell/"&gt;SSH Shell library&lt;/a&gt; and &lt;code&gt;TerminalControl&lt;/code&gt; supports East Asian full-width characters alongside Unicode surrogate pairs.
Prompt detection has been improved, and multi-line text matching is supported.&lt;/p&gt;
&lt;h2 id="major-graph-api-updates"&gt;Major Graph API updates&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://www.rebex.net/graph/"&gt;Rebex Graph&lt;/a&gt; got new methods for working with attachments, and for updating a message. Many existing methods have been enhanced: messages can be deleted permanently, and subfolders can be created.
The library features a new throttling support, making it easier not to overload the cloud.&lt;/p&gt;
&lt;h2 id="api-updates-changes-and-deprecations"&gt;API updates, changes and deprecations&lt;/h2&gt;
&lt;p&gt;In most scenarios, upgrading to version 8.0 is simple and straightforward. However, the new version of Rebex libraries does introduce some breaking changes, either due to abandoning long-deprecating APIs,
for security reasons, or to fix compatibility with third-party tools.
Before upgrading from 7.0, check out &lt;a href="https://www.rebex.net/kb/upgrading-to-8.0/"&gt;Version 8.0 Upgrade Guide&lt;/a&gt; for details.&lt;/p&gt;
&lt;h2 id="and-more"&gt;And more...&lt;/h2&gt;
&lt;p&gt;For more information about the new release and all its enhancements, see the &lt;a href="https://www.rebex.net/total-pack/history.aspx#8.0.9673"&gt;release history&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Rebex .NET libraries 8.0: Legacy Edition gets TLS 1.3</title>
			<link>https://blog.rebex.net/legacy-edition-8-0</link>
			<description>The new Legacy Edition brings TLS 1.3 to Windows CE and Windows XP, along with many other enhancements.</description>
			<author>Lukas Pokorny</author>
			<guid>https://blog.rebex.net/legacy-edition-8-0</guid>
			<pubDate>Thu, 16 Jul 2026 13:00:00 GMT</pubDate>
			<content:encoded>&lt;p&gt;Due to enduring demand, we decided to keep &lt;a href="https://www.rebex.net/kb/legacy-platform-support/"&gt;Legacy Edition&lt;/a&gt;
of Rebex libraries up-to-date once more.&lt;/p&gt;
&lt;p&gt;The new Legacy Edition v8.0 targets .NET Framework 2.0, .NET Compact Framework 3.5, and .NET Compact Framework 3.9,
making it possible to target systems as old as Windows 2000 or Windows Mobile 5, provided they have sufficient
operating memory.&lt;/p&gt;
&lt;p&gt;The new version adds lot of major new features from versions 6, 7, and 8, such as TLS 1.3 support
(might require &lt;a href="https://www.rebex.net/kb/elliptic-curve-plugins/"&gt;a plugin&lt;/a&gt; on very old platforms).&lt;/p&gt;
&lt;p&gt;The 8.0 series will almost certainly be the last to target .NET Framework 2.0 and .NET Compact Framework.
If you plan to use Rebex libraries on these platforms in 2028 and beyond, get in touch with us to discuss
long-term support and maintenance options.&lt;/p&gt;
&lt;p&gt;For more information about the 8.0 release and its enhancements,
see the &lt;a href="https://www.rebex.net/total-pack/history.aspx#8.0.9673"&gt;release history&lt;/a&gt; for mainstream edition.
However, please note that Legacy Edition lacks some of the more recent additions,
such as ML-KEM, ML-DSA, or server-side FTP support.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Rebex Buru SFTP Server 2.19.0: Argon2 password hashing</title>
			<link>https://blog.rebex.net/buru-sftp-release-2-19-0</link>
			<description>A new release of Rebex Buru SFTP Server with Argon2 password hashing support.</description>
			<author>Lukas Paluzga</author>
			<guid>https://blog.rebex.net/buru-sftp-release-2-19-0</guid>
			<pubDate>Tue, 26 May 2026 00:00:00 GMT</pubDate>
			<content:encoded>&lt;?# DownloadBox title="Download Buru SFTP Server"
    url="https://www.rebex.net/buru-sftp-server/download/"
    imageUrl="/images/buru-sftp-server-m.png"
/?&gt;
&lt;p&gt;We have released Rebex Buru SFTP Server v2.19.0. Here is an overview of changes, fixes and improvements.&lt;/p&gt;
&lt;p&gt;A big thank you to everyone who took the time to fill out our user survey! Most of the improvements in this release were directly shaped by your feedback. It really makes a difference, and we genuinely appreciate it. If you haven't had a chance to share your thoughts yet, we'd love to hear from you: &lt;strong&gt;&lt;a href="https://docs.google.com/forms/d/e/1FAIpQLSer9uIsjae91dhIOJ2ZZTH0GpppKHDrYIX8-E_QBBK_YqmD0Q/viewform"&gt;fill out the survey here&lt;/a&gt;&lt;/strong&gt;. It only takes a few minutes and helps us prioritize what matters most to you.&lt;/p&gt;
&lt;h3 id="argon2-password-hashing-2.19.0"&gt;Argon2 password hashing &lt;span class="version"&gt;(2.19.0)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Passwords stored in Buru SFTP Server's user database can now be hashed using &lt;strong&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9106"&gt;Argon2&lt;/a&gt;&lt;/strong&gt;, a memory-hard algorithm that is significantly more resistant to brute-force and GPU-accelerated cracking attacks than SHA-2. Argon2 comes in three variants: &lt;code&gt;argon2d&lt;/code&gt; (optimized against GPU attacks), &lt;code&gt;argon2i&lt;/code&gt; (optimized against side-channel attacks), and &lt;code&gt;argon2id&lt;/code&gt; (a hybrid recommended for most use cases).&lt;/p&gt;
&lt;p&gt;Unlike SHA-2, which is designed to be fast, Argon2 is intentionally expensive to compute. It requires much larger amount of RAM and CPU time, making cracking attacks far more costly. All parameters (parallelism, memory cost, time cost) are configurable.&lt;/p&gt;
&lt;p&gt;Note that password hashing does not affect the security of the login process itself. Its purpose is to protect users' passwords in the event of a user database leak. When using Argon2 with recommended values, recovering the original passwords from a stolen database is extremely costly.&lt;/p&gt;
&lt;p&gt;To enable Argon2, set &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/configuration/config-yaml/users/#userspasswordhashalgorithm"&gt;&lt;code&gt;users.passwordHashAlgorithm&lt;/code&gt;&lt;/a&gt; in your configuration:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-yaml"&gt;users:
  passwordHashAlgorithm: { type: argon2id }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;passwordHashAlgorithm&lt;/code&gt; setting also continues to accept a plain string value (e.g. &lt;code&gt;SHA512&lt;/code&gt;) for simpler configurations.&lt;/p&gt;
&lt;h3 id="setting-pre-hashed-passwords-for-existing-users"&gt;Setting pre-hashed passwords for existing users&lt;/h3&gt;
&lt;p&gt;The &lt;code&gt;--password-hash&lt;/code&gt; option, previously available only in &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/burusftp-cli-commands/user-add/"&gt;&lt;code&gt;burusftp user add&lt;/code&gt;&lt;/a&gt;, has been added to &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/burusftp-cli-commands/user-update/"&gt;&lt;code&gt;burusftp user update&lt;/code&gt;&lt;/a&gt; as well. This makes it possible to assign a pre-hashed password to an existing user from the command line, which is useful when migrating password hashes from another system.&lt;/p&gt;
&lt;h3 id="minor-changes-and-fixes"&gt;Minor changes and fixes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SSH
&lt;ul&gt;
&lt;li&gt;Fixed &lt;code&gt;diffie-hellman-group17-sha512&lt;/code&gt; and &lt;code&gt;diffie-hellman-group18-sha512&lt;/code&gt; being advertised but not usable as key exchange algorithms. &lt;span class="version"&gt;(2.18.4)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Fixed terminal shell execution when running as a different user incorrectly requiring &lt;code&gt;SeTcbPrivilege&lt;/code&gt; instead of &lt;code&gt;SeAssignPrimaryTokenPrivilege&lt;/code&gt; and &lt;code&gt;SeIncreaseQuotaPrivilege&lt;/code&gt;. &lt;span class="version"&gt;(2.18.4)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Web Admin
&lt;ul&gt;
&lt;li&gt;Added &amp;quot;Add new user&amp;quot; button to the users toolbar. &lt;span class="version"&gt;(2.19.0)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Added Save button to breadcrumb navigation on select pages. &lt;span class="version"&gt;(2.19.0)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Fixed breadcrumb display on Protection and FTP settings pages. &lt;span class="version"&gt;(2.19.0)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Fixed placeholder text showing incorrect hour values for idle duration and session duration fields. &lt;span class="version"&gt;(2.18.4)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;For a complete list of fixes and improvements, see the &lt;a href="https://www.rebex.net/buru-sftp-server/doc/release-notes"&gt;Release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can report issues and submit feature requests on our &lt;a href="https://github.com/rebexnet/buru-sftp-server/"&gt;Github issue tracker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For discussions and specific problems, please continue using our &lt;a href="https://forum.rebex.net/"&gt;support forum&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Rebex Drive: Connect SFTP, FTP, and WebDAV storage as a Windows drive</title>
			<link>https://blog.rebex.net/rebex-drive-preview</link>
			<description>Try Rebex Drive public preview. Connect remote SFTP, FTP, FTP/SSL, or WebDAV storage and use it like a normal Windows drive.</description>
			<author>Martin Vobr</author>
			<guid>https://blog.rebex.net/rebex-drive-preview</guid>
			<pubDate>Tue, 19 May 2026 00:00:00 GMT</pubDate>
			<content:encoded>&lt;h2 id="rebex-drive-public-preview-is-here"&gt;Rebex Drive public preview is here&lt;/h2&gt;
&lt;p&gt;We have just released &lt;a href="https://www.rebex.net/drive/"&gt;Rebex Drive&lt;/a&gt; - a &lt;strong&gt;free app&lt;/strong&gt; that allows you to mount SFTP, FTP and WebDAV storage as a network drive.&lt;/p&gt;
&lt;p&gt;&lt;img src="/images/rebex-drive-preview-screenshot.png" class="img-fluid" alt="Rebex Drive UI" /&gt;&lt;/p&gt;
&lt;?# DownloadBox title="Download Rebex Drive"
    url="https://www.rebex.net/drive/download/"
    imageUrl="/images/drive-m.png"
/?&gt;
&lt;h2 id="connect-remote-sftp-ftp-or-webdav-storage-and-use-it-like-a-normal-windows-drive"&gt;Connect remote SFTP, FTP, or WebDAV storage and use it like a normal Windows drive&lt;/h2&gt;
&lt;p&gt;Working with files on a remote server is often more cumbersome than it should be.&lt;/p&gt;
&lt;p&gt;You have data on an SFTP, FTP, FTP/SSL, or WebDAV server. You need to edit it, copy it, organize it, or open it in your usual tools. One option is to use a dedicated file transfer client, such as WinSCP, download the files locally, work with them, and upload them back when you are done.&lt;/p&gt;
&lt;p&gt;That works. But it is not always convenient.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Rebex Drive&lt;/strong&gt; takes a different approach. It lets you mount remote storage as a Windows drive, so you can work with remote files almost as if they were on a normal network disk.&lt;/p&gt;
&lt;p&gt;Once mounted, the remote storage is available to regular Windows applications:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows Explorer&lt;/li&gt;
&lt;li&gt;Microsoft Office&lt;/li&gt;
&lt;li&gt;Photo managers&lt;/li&gt;
&lt;li&gt;Development tools
&lt;ul&gt;
&lt;li&gt;Anything else that works with files on a Windows drive&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;No special integration is needed in those applications. They just see a drive.&lt;/p&gt;
&lt;h2 id="whats-included-in-the-first-preview"&gt;What's included in the first preview&lt;/h2&gt;
&lt;p&gt;We have released the first public preview of Rebex Drive.&lt;/p&gt;
&lt;p&gt;This preview version is completely free.&lt;/p&gt;
&lt;p&gt;It currently supports:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SFTP&lt;/li&gt;
&lt;li&gt;FTP and FTP/SSL&lt;/li&gt;
&lt;li&gt;WebDAV&lt;/li&gt;
&lt;li&gt;mapping any number of remote drives&lt;br /&gt;
(well, at least until you run out of free drive letters)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The goal is simple: connect remote storage and use it from Windows like a normal drive.&lt;/p&gt;
&lt;h2 id="try-it-and-tell-us-what-you-think"&gt;Try it and tell us what you think&lt;/h2&gt;
&lt;p&gt;Rebex Drive is still in preview, so feedback matters. Want to add another protocol? A specific feature? Let us know.&lt;/p&gt;
&lt;p&gt;If you try it, we would like to hear what worked, what did not, and what would make it more useful for your workflow.&lt;/p&gt;
&lt;?# DownloadBox title="Download Rebex Drive"
    url="https://www.rebex.net/drive/download/"
    imageUrl="/images/drive-m.png"
/?&gt;
&lt;p&gt;Comments, bug reports, and feature suggestions are welcome at: &lt;a href="mailto:support&amp;#64;rebex.net?subject=Rebex%20Drive%20feedback"&gt;support&amp;#64;rebex.net&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Rebex Buru SFTP Server 2.18.0: Post-quantum cryptography and SSH/SFTP core improvements</title>
			<link>https://blog.rebex.net/buru-sftp-release-2-18-0</link>
			<description>A new release of Rebex Buru SFTP Server with post-quantum cryptography support and SSH/SFTP core improvements.</description>
			<author>Lukas Paluzga</author>
			<guid>https://blog.rebex.net/buru-sftp-release-2-18-0</guid>
			<pubDate>Tue, 03 Mar 2026 00:00:00 GMT</pubDate>
			<content:encoded>&lt;?# DownloadBox title="Download Buru SFTP Server"
    url="https://www.rebex.net/buru-sftp-server/download/"
    imageUrl="/images/buru-sftp-server-m.png"
/?&gt;
&lt;p&gt;We have released Rebex Buru SFTP Server v2.18.0. Here is an overview of changes, fixes and improvements.&lt;/p&gt;
&lt;h3 id="post-quantum-key-exchange-ciphers-2.18.0"&gt;Post-quantum key exchange ciphers &lt;span class="version"&gt;(2.18.0)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Quantum computers, once sufficiently powerful, might be able to break classical public-key cryptography such as RSA and elliptic-curve Diffie-Hellman. While large-scale quantum computers don't exist yet, encrypted data captured today could be decrypted in the future — a threat known as &amp;quot;harvest now, decrypt later&amp;quot;.&lt;/p&gt;
&lt;p&gt;To address this, Buru SFTP Server 2.18.0 adds support for &lt;a href="https://csrc.nist.gov/pubs/fips/203/final"&gt;NIST-standardized post-quantum key exchange&lt;/a&gt; based on &lt;strong&gt;ML-KEM&lt;/strong&gt; (CRYSTALS-Kyber), used in a hybrid construction alongside classical algorithms. This means the key exchange is secure against both classical and quantum attacks:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;mlkem768x25519-sha256&lt;/code&gt; — ML-KEM-768 combined with X25519&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mlkem768nistp256-sha256&lt;/code&gt; — ML-KEM-768 combined with NIST P-256&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mlkem1024nistp384-sha384&lt;/code&gt; — ML-KEM-1024 combined with NIST P-384&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;These algorithms are already supported by OpenSSH 9.0+ and other modern SSH clients. See the &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/supported-ssh-algorithms/"&gt;full list of supported SSH algorithms&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="sshsftp-core-overhaul-2.18.0"&gt;SSH/SFTP core overhaul &lt;span class="version"&gt;(2.18.0)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;The SSH and SFTP processing core has been significantly redesigned to improve performance and reduce memory and thread usage. These improvements are most noticeable when serving many simultaneous connections.&lt;/p&gt;
&lt;p&gt;Elliptic curve algorithm performance has also been improved on modern platforms.&lt;/p&gt;
&lt;h3 id="additional-key-exchange-algorithms-2.18.0"&gt;Additional key exchange algorithms &lt;span class="version"&gt;(2.18.0)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Two additional Diffie-Hellman key exchange algorithms are now supported, offering stronger security:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;diffie-hellman-group17-sha512&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;diffie-hellman-group18-sha512&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;See the &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/supported-ssh-algorithms/"&gt;full list of supported SSH algorithms&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="copy-data-sftp-extension-2.18.0"&gt;&lt;code&gt;copy-data&lt;/code&gt; SFTP extension &lt;span class="version"&gt;(2.18.0)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Buru SFTP Server now supports the &lt;a href="https://datatracker.ietf.org/doc/html/draft-ietf-secsh-filexfer-extensions-00"&gt;&lt;code&gt;copy-data&lt;/code&gt; SFTP extension&lt;/a&gt;, which allows clients to request server-side file copies without transferring data over the network. This results in significantly faster copy operations, especially for large files.&lt;/p&gt;
&lt;h3 id="minor-changes-and-fixes"&gt;Minor changes and fixes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SSH
&lt;ul&gt;
&lt;li&gt;Improved compatibility with some SSH clients that are sensitive to the order of SSH shell channel messages. &lt;span class="version"&gt;(2.18.1)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;FTP
&lt;ul&gt;
&lt;li&gt;Fixed behavior of &lt;code&gt;ftp.bindings[].externalAddress&lt;/code&gt; and &lt;code&gt;ftp.bindings[].dataPortRange&lt;/code&gt; in FTPS implicit mode. &lt;span class="version"&gt;(2.18.2)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Installer
&lt;ul&gt;
&lt;li&gt;Now checks for a valid license before overwriting the existing installation when upgrading. &lt;span class="version"&gt;(2.18.0)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Silent uninstallation (&lt;code&gt;/SILENT&lt;/code&gt;) no longer prompts for confirmation and deletes all configuration files. &lt;span class="version"&gt;(2.17.3)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Web Admin
&lt;ul&gt;
&lt;li&gt;Log viewer now shows the last 50 kB of the log file, with an option to view or download the full file. &lt;span class="version"&gt;(2.18.3)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Fixed 2FA status not being indicated correctly for some users. &lt;span class="version"&gt;(2.18.0)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Fixed an error when saving a user with an SSH public key. &lt;span class="version"&gt;(2.17.2)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Fixed an incorrect warning message &amp;quot;The WebRootPath was not found&amp;quot;. &lt;span class="version"&gt;(2.17.3)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Log viewer is now accessible even when the configuration file is invalid but readable. &lt;span class="version"&gt;(2.17.3)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;User's virtual path can now be specified without a leading slash. &lt;span class="version"&gt;(2.17.3)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Improved readability of users' public keys. &lt;span class="version"&gt;(2.17.3)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Other
&lt;ul&gt;
&lt;li&gt;Fixed LiteDB database locking error. &lt;span class="version"&gt;(2.18.3)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Fixed startup error when &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/configuration/config-yaml/sshtunneling/"&gt;&lt;code&gt;sshTunneling&lt;/code&gt;&lt;/a&gt; is present but disabled in the configuration file. &lt;span class="version"&gt;(2.17.1)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;User authentication method is now logged at &lt;code&gt;information&lt;/code&gt; level (previously &lt;code&gt;debug&lt;/code&gt;). &lt;span class="version"&gt;(2.17.3)&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;Added an error log message when the service starts under the SYSTEM account with &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/configuration/config-yaml/sshshell/"&gt;&lt;code&gt;defaultShellType: terminal&lt;/code&gt;&lt;/a&gt; and &lt;code&gt;allowSystemAccount&lt;/code&gt; not enabled. &lt;span class="version"&gt;(2.17.3)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;For a complete list of fixes and improvements, see the &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/release-notes"&gt;Release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can report issues and submit feature requests on our &lt;a href="https://github.com/rebexnet/buru-sftp-server/"&gt;Github issue tracker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For discussions and specific problems, please continue using our &lt;a href="https://forum.rebex.net/"&gt;support forum&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Rebex .NET components 7.0.9448: Support for .NET 10</title>
			<link>https://blog.rebex.net/version-7-0-9448</link>
			<description>This release adds support for .NET 10, the latest iteration of .NET platform.</description>
			<author>Lukas Pokorny</author>
			<guid>https://blog.rebex.net/version-7-0-9448</guid>
			<pubDate>Tue, 18 Nov 2025 00:00:00 GMT</pubDate>
			<content:encoded>&lt;h2 id="support-for.net-10"&gt;Support for .NET 10&lt;/h2&gt;
&lt;p&gt;This release adds a new set of binaries targeting &lt;a href="https://dotnet.microsoft.com/en-us/download/dotnet/9.0"&gt;.NET 10&lt;/a&gt;.
The following platforms are supported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows (x64, x86, ARM64)&lt;/li&gt;
&lt;li&gt;Linux (x64, ARM32, ARM64)&lt;/li&gt;
&lt;li&gt;Android (x64, ARM32, ARM64)&lt;/li&gt;
&lt;li&gt;macOS (ARM64, x64)&lt;/li&gt;
&lt;li&gt;iOS/iPadOS/tvOS (ARM64)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, we still support earlier versions of .NET as well, including .NET Framework 3.5-4.8.1 and .NET 8-9.
Additionally, support for .NET Compact Framework 3.5/3.9 and .NET Framework 2.0 is still available with &lt;a href="https://www.rebex.net/kb/legacy-platform-support/"&gt;Legacy Edition&lt;/a&gt;.
For more information about supported platforms, see our &lt;a href="https://www.rebex.net/kb/framework-support/"&gt;framework support chart&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="support-for-visual-studio-2026"&gt;Support for Visual Studio 2026&lt;/h2&gt;
&lt;p&gt;In addition to Visual Studio 2022 and 2019, Rebex libraries and samples support the latest Visual Studio 2026.&lt;/p&gt;
&lt;h2 id="and-more"&gt;And more...&lt;/h2&gt;
&lt;p&gt;For a detailed list of changes, see the &lt;a href="https://www.rebex.net/total-pack/history.aspx#7.0.9448"&gt;release history&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Migrating from EWS to Microsoft Graph</title>
			<link>https://blog.rebex.net/migrating-ews-to-graph</link>
			<description>This migration guide explains how to enable Microsoft Graph access to Exchange Online and demonstrates how to perform common mailbox operations using the Microsoft Graph API.</description>
			<author>Lukas Matyska</author>
			<guid>https://blog.rebex.net/migrating-ews-to-graph</guid>
			<pubDate>Tue, 23 Sep 2025 00:00:00 GMT</pubDate>
			<content:encoded>&lt;p&gt;Note: Sample code in this article uses Rebex Graph .NET library. Download it here:&lt;/p&gt;
&lt;?# DownloadBox title="Download Rebex Graph .NET library"
    url="https://www.rebex.net/graph"
    imageUrl="/images/graph-logo-m.png"
/?&gt;
&lt;p&gt;Microsoft will &lt;a href="https://techcommunity.microsoft.com/blog/exchange/retirement-of-exchange-web-services-in-exchange-online/3924440"&gt;retire Exchange Web Services (EWS) in Exchange Online&lt;/a&gt; on October 1, 2026. The recommended way to access Exchange Online (Microsoft 365) going forward is via the &lt;a href="https://learn.microsoft.com/en-us/graph/overview"&gt;Microsoft Graph API&lt;/a&gt;.
This guide describes how to migrate from EWS to Microsoft Graph in order to access Exchange Online, and demonstrates how the same mailbox operations can be performed using &lt;a href="https://www.rebex.net/ews/"&gt;Rebex EWS&lt;/a&gt; and &lt;a href="https://www.rebex.net/graph/"&gt;Rebex Graph&lt;/a&gt; libraries for .NET.&lt;/p&gt;
&lt;p&gt;Working directly with Microsoft Graph API means dealing with raw HTTP requests and handling many low-level details of the REST protocol. &lt;a href="https://www.rebex.net/graph/"&gt;Rebex Graph&lt;/a&gt; provides a high-level API for accessing Exchange Online via Graph - without requiring deep knowledge of the protocol itself.&lt;/p&gt;
&lt;p&gt;Key advantages of using &lt;a href="https://www.rebex.net/graph/"&gt;Rebex Graph&lt;/a&gt; library:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A developer-friendly &lt;a href="https://www.rebex.net/graph/features/easy-to-use-api.aspx"&gt;easy-to-use API&lt;/a&gt; that abstracts away the complexity of raw Graph requests.&lt;/li&gt;
&lt;li&gt;Built-in &lt;strong&gt;S/MIME support&lt;/strong&gt;, including parsing and working with signed or encrypted messages.&lt;/li&gt;
&lt;li&gt;Automatic handling of throttling responses (HTTP 429/503/504 error codes) with retries logic.&lt;/li&gt;
&lt;li&gt;Wide platform support, including .NET 5-10, .NET Framework 3.5-4.8 on Windows 7/8/10/11&lt;br /&gt;
(even .NET Compact Framework 3.5-3.9 is still supported).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Microsoft Graph does not offer full feature parity with EWS. Some advanced or specialized operations may not yet be available or may require workarounds.&lt;/p&gt;
&lt;div class='blog-toc'&gt;
&lt;h2 id="table-of-contents"&gt;Table of contents&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#configure"&gt;Configuring Graph access to Exchange Online&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#permissions"&gt;Changing application permissions&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#scopes"&gt;Changing OAuth scopes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#sample-apps"&gt;Sample applications&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#usecases"&gt;Migrating to Graph&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#connect"&gt;Connecting and authenticating to Exchange Online&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#list-messages"&gt;Listing Inbox messages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#search-messages"&gt;Searching for messages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#download"&gt;Downloading e-mail messages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#send"&gt;Sending messages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#update-messages"&gt;Updating messages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#delete-messages"&gt;Deleting messages&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#list-folders"&gt;Listing folders&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#create-folder"&gt;Creating folders&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#delete-folder"&gt;Deleting folders&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="configure"&gt;Configuring Graph access to Exchange Online&lt;/h2&gt;
&lt;p&gt;Migrating from EWS to Microsoft Graph is not just a matter of switching API calls — it also requires updates to your authentication and permission setup. In this section, we'll highlight two essential changes you need to make before your application can access Exchange Online via Graph.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="permissions"&gt;Changing application permissions&lt;/h2&gt;
&lt;p&gt;To access Exchange Online, your application needs to obtain an OAuth 2.0 token. Since &lt;a href="https://learn.microsoft.com/en-us/lifecycle/announcements/basic-auth-deprecation-exchange-online"&gt;Microsoft started disabling Basic Authentication for Exchange Online&lt;/a&gt; in October 2022, your app should already be registered in Azure Portal using an App Registration.&lt;/p&gt;
&lt;p&gt;To switch to Microsoft Graph, you must configure new Graph-specific permissions in the &lt;a href="https://portal.azure.com/"&gt;Azure Portal&lt;/a&gt; based on your application's functionality. Here are some commonly used permissions when working with emails:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Mail.Read&lt;/code&gt; - read mailbox contents&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Mail.ReadWrite&lt;/code&gt; - full read/write access to mailbox&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Mail.Send&lt;/code&gt; - send mail as a user&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Depending on you application type choose either &lt;code&gt;Delegated&lt;/code&gt; or &lt;code&gt;Application&lt;/code&gt; &lt;a href="https://learn.microsoft.com/en-us/graph/permissions-overview#permission-types"&gt;permission type&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="example-of-permission-changes-for-an-application-operating-in-delegated-signed-in-user-mode"&gt;Example of permission changes for an application operating in delegated (signed-in user) mode:&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Previous EWS permissions:&lt;/strong&gt;
&lt;img class="mx-auto d-block border" alt="EWS app permissions - delegated" src="/images/2025/azure-permissions-EWS-delegated.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New Graph permissions:&lt;/strong&gt;
&lt;img class="mx-auto d-block border" alt="Graph app permissions - delegated" src="/images/2025/azure-permissions-Graph-delegated.png" /&gt;&lt;/p&gt;
&lt;h3 id="example-of-permission-changes-for-an-application-operating-in-unattended-application-mode"&gt;Example of permission changes for an application operating in unattended (application) mode:&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;Previous EWS permissions:&lt;/strong&gt;
&lt;img class="mx-auto d-block border" alt="EWS app permissions - application" src="/images/2025/azure-permissions-EWS-application.png" /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New Graph permissions:&lt;/strong&gt;
&lt;img class="mx-auto d-block border" alt="Graph app permissions - application" src="/images/2025/azure-permissions-Graph-application.png" /&gt;&lt;/p&gt;
&lt;p&gt;If you prefer to configure new Azure App Registration from start, you can follow our blog posts to configure Graph access in &lt;a href="https://blog.rebex.net/office365-graph-oauth-delegated"&gt;delegated (signed-in user)&lt;/a&gt; mode or &lt;a href="https://blog.rebex.net/office365-graph-oauth-unattended"&gt;unattended (application)&lt;/a&gt; mode.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="scopes"&gt;Changing OAuth scopes&lt;/h2&gt;
&lt;p&gt;When moving from EWS to Microsoft Graph, you also need to update the OAuth scope used for token requests.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Previous EWS scopes:&lt;/strong&gt; commonly include either &lt;code&gt;https://outlook.office365.com/.default&lt;/code&gt; or &lt;code&gt;https://outlook.office365.com/EWS.AccessAsUser.All&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;New Graph scopes:&lt;/strong&gt; the simplest option is to use &lt;code&gt;https://graph.microsoft.com/.default&lt;/code&gt; - this instructs the Microsoft identity platform to issue a token based on the permissions configured in the App Registration. Alternatively, you can explicitly request only a subset of those permissions using scopes such as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://graph.microsoft.com/Mail.Read&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://graph.microsoft.com/Mail.ReadWrite&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://graph.microsoft.com/Mail.Send&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Find more about &lt;a href="https://learn.microsoft.com/en-us/entra/identity-platform/scopes-oidc"&gt;scopes and permissions in the Microsoft identity platform&lt;/a&gt;.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="sample-apps"&gt;Sample applications&lt;/h2&gt;
&lt;p&gt;To verify that your configuration works, you can use our sample applications available on &lt;a href="https://github.com/rebexnet/RebexExtras/blob/master/Office365_OAuth2_IdentityClient/README.md"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;To test access in &lt;strong&gt;delegated (signed-in user)&lt;/strong&gt; mode, use the &lt;a href="https://github.com/rebexnet/RebexExtras/tree/master/Office365_OAuth2_IdentityClient/GraphOAuthWpfApp_IdentityClient"&gt;GraphOAuthWpfApp&lt;/a&gt; sample.&lt;br /&gt;
To test access in &lt;strong&gt;unattended (application)&lt;/strong&gt; mode, use the &lt;a href="https://github.com/rebexnet/RebexExtras/tree/master/Office365_OAuth2_IdentityClient/GraphOAuthAppOnlyConsole_IdentityClient"&gt;GraphOAuthAppOnlyConsole&lt;/a&gt; sample.&lt;br /&gt;
 &lt;/p&gt;
&lt;h1 id="usecases"&gt;Migrating to Graph&lt;/h1&gt;
&lt;p&gt;In this section, we’ll demonstrate how common mailbox operations were implemented using &lt;a href="https://www.rebex.net/ews/"&gt;Rebex EWS&lt;/a&gt; and how they can be implemented using &lt;a href="https://www.rebex.net/graph/"&gt;Rebex Graph&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="connect"&gt;Connecting and authenticating to Exchange Online&lt;/h2&gt;
&lt;p&gt;With Rebex EWS, &lt;a href="https://www.rebex.net/ews/features/connecting.aspx"&gt;connecting&lt;/a&gt; and &lt;a href="https://www.rebex.net/ews/features/authentication.aspx#oauth20"&gt;authenticating&lt;/a&gt; looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create EWS client instance
var client = new Rebex.Net.Ews();

// connect and authenticate to Exchange Online server
client.Connect(&amp;quot;outlook.office365.com&amp;quot;);
client.Login(token, EwsAuthentication.OAuth20);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With Rebex Graph, the code for &lt;a href="https://www.rebex.net/graph/features/connect-and-authenticate.aspx"&gt;connecting and authenticating&lt;/a&gt; looks similar:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create Graph client instance
var client = new Rebex.Net.GraphClient();

// connect and authenticate to Exchange Online server
client.Connect();
client.Login(token);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In EWS SOAP API, client connects to &lt;code&gt;https://outlook.office365.com/EWS/Exchange.asmx&lt;/code&gt;.&lt;br /&gt;
In Graph REST API, all requests go to &lt;code&gt;https://graph.microsoft.com/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In both cases, client authenticates using the &lt;code&gt;Authorization&lt;/code&gt; header with a &lt;a href="https://learn.microsoft.com/en-us/graph/auth/auth-concepts#access-tokens"&gt;Bearer token&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; EWS supports both on-premises Exchange servers and Exchange Online, whereas Microsoft Graph is available exclusively for Exchange Online.&lt;br /&gt;
&lt;strong&gt;Note:&lt;/strong&gt; EWS supports various authentication methods, including Basic Auth, NTLM, and Kerberos, whereas Microsoft Graph relies exclusively on OAuth 2.0.&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="list-messages"&gt;Listing Inbox messages&lt;/h2&gt;
&lt;p&gt;With Rebex EWS, &lt;a href="https://www.rebex.net/ews/features/messages.aspx#list"&gt;listing messages&lt;/a&gt; looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate EWS client instance
var client = new Rebex.Net.Ews();
client.Connect(&amp;quot;outlook.office365.com&amp;quot;);
client.Login(token, EwsAuthentication.OAuth20);

var messages = client.GetMessageList(EwsFolderId.Inbox);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With Rebex Graph, the code for &lt;a href="https://www.rebex.net/graph/features/messages.aspx#list"&gt;listing messages&lt;/a&gt; looks similar:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate Graph client instance
var client = new Rebex.Net.GraphClient();
client.Connect();
client.Login(token);

var messages = client.GetMessageList(GraphFolderId.Inbox);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In EWS SOAP API, messages were listed using the &lt;code&gt;FindItems&lt;/code&gt; operation.&lt;br /&gt;
In Graph REST API, messages from the Inbox are retrieved by requesting:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GET https://graph.microsoft.com/v1.0/me/mailFolders/inbox/messages&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;For details, see &lt;a href="https://learn.microsoft.com/en-us/graph/api/user-list-messages"&gt;List messages&lt;/a&gt; in the Microsoft documentation.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="search-messages"&gt;Searching for messages&lt;/h2&gt;
&lt;p&gt;Microsoft Graph API provides two kinds of searching: &lt;code&gt;$filter&lt;/code&gt; and full-text &lt;code&gt;$search&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;With Rebex EWS, the &lt;a href="https://www.rebex.net/ews/features/search.aspx"&gt;equivalent code&lt;/a&gt; for a &lt;code&gt;$filter&lt;/code&gt; search and full-text &lt;code&gt;$search&lt;/code&gt; (uses &lt;a href="https://learn.microsoft.com/en-us/exchange/client-developer/exchange-web-services/how-to-perform-an-aqs-search-by-using-ews-in-exchange"&gt;AQS search&lt;/a&gt;) looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate EWS client instance
var client = new Rebex.Net.Ews();
client.Connect(&amp;quot;outlook.office365.com&amp;quot;);
client.Login(token, EwsAuthentication.OAuth20);

// perform EWS message search
var messages = client.Search(EwsFolderId.Inbox, EwsSearchParameter.Subject(&amp;quot;invoice&amp;quot;));

// perform full-text AQS search
var fullText = client.Search(EwsFolderId.Inbox, EwsItemFields.Envelope, new EwsListView(), &amp;quot;subject:invoice&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With Rebex Graph, &lt;a href="https://www.rebex.net/graph/features/search.aspx"&gt;searching for messages&lt;/a&gt; looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate Graph client instance
var client = new Rebex.Net.GraphClient();
client.Connect();
client.Login(token);

// perform the `$filter` search
var messages = client.Search(&amp;quot;inbox&amp;quot;, GraphMessageSearchParameter.Subject(&amp;quot;invoice&amp;quot;));

// perform full-text `$search`
var query = new GraphMessageSearchQuery()
{
    RawSearch = &amp;quot;subject:invoice&amp;quot;
};
var fullText = client.Search(&amp;quot;inbox&amp;quot;, query);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In EWS SOAP API, messages were searched using the &lt;code&gt;FindItems&lt;/code&gt; operation with search filters.&lt;br /&gt;
In Graph REST API, search can be performed using the &lt;code&gt;$filter&lt;/code&gt; query parameter:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GET https://graph.microsoft.com/v1.0/me/messages?$filter=contains(subject,'invoice')&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;or the &lt;code&gt;$search&lt;/code&gt; query parameter for full-text search:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GET https://graph.microsoft.com/v1.0/me/messages?$search=&amp;quot;subject:invoice&amp;quot;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Microsoft Graph &lt;code&gt;$search&lt;/code&gt; works only for a limited set of message properties (approximately 15).&lt;br /&gt;
&lt;strong&gt;Note:&lt;/strong&gt; Microsoft Graph cannot apply &lt;code&gt;$filter&lt;/code&gt; to properties that are collections of complex objects (such as &lt;code&gt;toRecipients&lt;/code&gt;, &lt;code&gt;ccRecipients&lt;/code&gt; or &lt;code&gt;bccRecipients&lt;/code&gt;). Use &lt;code&gt;$search&lt;/code&gt; for filtering based on recipients instead.&lt;br /&gt;
&lt;strong&gt;Note:&lt;/strong&gt; Microsoft Graph does not support combining &lt;code&gt;$filter&lt;/code&gt; and &lt;code&gt;$search&lt;/code&gt; in a single query, which makes it difficult to filter messages effectively - especially when filtering by recipients.&lt;br /&gt;
&lt;strong&gt;Note:&lt;/strong&gt; Microsoft Graph imposes limitations on the use of the &lt;code&gt;$orderby&lt;/code&gt; parameter. In some cases, this may result in the &lt;code&gt;The restriction or sort order is too complex for this operation&lt;/code&gt; error. For details, see &lt;a href="https://learn.microsoft.com/en-us/graph/api/user-list-messages?view=graph-rest-1.0&amp;amp;tabs=http#using-filter-and-orderby-in-the-same-query"&gt;Using filter and orderby in the same query&lt;/a&gt; in the Microsoft documentation.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;For details, see &lt;a href="https://learn.microsoft.com/en-us/graph/filter-query-parameter"&gt;Filter&lt;/a&gt; and &lt;a href="https://learn.microsoft.com/en-us/graph/search-query-parameter"&gt;Search&lt;/a&gt; in the Microsoft documentation.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="download"&gt;Downloading e-mail messages&lt;/h2&gt;
&lt;p&gt;With Rebex EWS, &lt;a href="https://www.rebex.net/ews/features/messages.aspx#download"&gt;downloading messages&lt;/a&gt; looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate EWS client instance
var client = new Rebex.Net.Ews();
client.Connect(&amp;quot;outlook.office365.com&amp;quot;);
client.Login(token, EwsAuthentication.OAuth20);

// get the message ID
EwsItemId messageId = ...

// download the message directly to a file on disk
client.GetMessage(messageId, &amp;quot;mail.eml&amp;quot;);

// download the message and parse it for further processing
MailMessage message = client.GetMailMessage(messageId);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With Rebex Graph, the code for &lt;a href="https://www.rebex.net/graph/features/messages.aspx#download"&gt;downloading messages&lt;/a&gt; looks similar:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate Graph client instance
var client = new Rebex.Net.GraphClient();
client.Connect();
client.Login(token);

// get the message ID
GraphMessageId messageId = ...

// download the message directly to a file on disk
client.GetMessage(messageId, &amp;quot;mail.eml&amp;quot;);

// download the message and parse it for further processing
MailMessage message = client.GetMailMessage(messageId);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In EWS SOAP API, a message was retrieved using the &lt;code&gt;GetItem&lt;/code&gt; operation.&lt;br /&gt;
In Graph REST API, a message is retrieved by requesting its &lt;code&gt;$value&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GET https://graph.microsoft.com/v1.0/me/messages/{messageId}/$value&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;For details, see &lt;a href="https://learn.microsoft.com/en-us/graph/api/message-get"&gt;Get message&lt;/a&gt; in the Microsoft documentation.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="send"&gt;Sending messages&lt;/h2&gt;
&lt;p&gt;With Rebex EWS, &lt;a href="https://www.rebex.net/ews/features/sending-emails.aspx"&gt;sending messages&lt;/a&gt; looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate EWS client instance
var client = new Rebex.Net.Ews();
client.Connect(&amp;quot;outlook.office365.com&amp;quot;);
client.Login(token, EwsAuthentication.OAuth20);

// compose message
MailMessage message = ...

// send the message
client.SendMessage(message);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With Rebex Graph, the code for &lt;a href="https://www.rebex.net/graph/features/sending-emails.aspx"&gt;sending messages&lt;/a&gt; looks similar:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate Graph client instance
var client = new Rebex.Net.GraphClient();
client.Connect();
client.Login(token);

// compose message
var message = new MailMessage();
message.To = &amp;quot;to&amp;#64;example.com&amp;quot;;
message.Subject = &amp;quot;Hello from Rebex Graph&amp;quot;;
message.BodyHtml = &amp;quot;This message was sent using &amp;lt;b&amp;gt;Rebex Graph&amp;lt;/b&amp;gt;&amp;quot;;

// send the message
client.SendMessage(message);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In EWS SOAP API, the &lt;code&gt;CreateItem&lt;/code&gt; operation with &lt;code&gt;SendAndSaveCopy&lt;/code&gt; was used.&lt;br /&gt;
In Graph REST API, sending a message requires a &lt;code&gt;POST&lt;/code&gt; request:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;POST https://graph.microsoft.com/v1.0/me/sendMail&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;and setting desired &lt;code&gt;Content-Type&lt;/code&gt; header and request body content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This operation requires &lt;code&gt;Mail.Send&lt;/code&gt; permission to be configured in Azure App Registration.&lt;br /&gt;
&lt;strong&gt;Note:&lt;/strong&gt; Microsoft occasionally changes the limits of Microsoft Graph API. In 2024, the size limit for a MIME message sent via &lt;code&gt;sendMail&lt;/code&gt; was 3 MB.
However, as of September 2025, we were able to successfully send a 45 MB message using &lt;code&gt;sendMail&lt;/code&gt; (with default mailbox settings).
The message size limits can be configured in the Microsoft 365 Exchange admin center (up to 150 MB).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;For details, see &lt;a href="https://learn.microsoft.com/en-us/graph/api/user-sendmail"&gt;Send mail&lt;/a&gt; in the Microsoft documentation.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="update-messages"&gt;Updating messages&lt;/h2&gt;
&lt;p&gt;With Rebex EWS, &lt;a href="https://www.rebex.net/ews/features/messages.aspx#metadata"&gt;updating messages&lt;/a&gt; looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate EWS client instance
var client = new Rebex.Net.Ews();
client.Connect(&amp;quot;outlook.office365.com&amp;quot;);
client.Login(token, EwsAuthentication.OAuth20);

// prepare message updates
var updates = new EwsMessageMetadata()
{
    Flag = new EwsFlag(EwsFlagStatus.Completed) { CompleteDate = DateTime.Today },
    Categories = new EwsCategoryCollection(&amp;quot;Invoice&amp;quot;, &amp;quot;Processed&amp;quot;),
    Importance = MailPriority.Low,
    IsRead = true,
};

// apply updates
client.UpdateItem(messageId, updates);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With Rebex Graph, the code for &lt;a href="https://www.rebex.net/graph/features/messages.aspx#update"&gt;updating messages&lt;/a&gt; looks similar:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate Graph client instance
var client = new Rebex.Net.GraphClient();
client.Connect();
client.Login(token);

// prepare message updates
var updates = new GraphMessageData()
{
    Flag = GraphFlag.CreateCompleted(DateTime.Today),
    Categories = new GraphCategoryCollection(&amp;quot;Invoice&amp;quot;, &amp;quot;Processed&amp;quot;),
    Importance = GraphImportance.Low,
    IsRead = true,
};

// apply updates
client.UpdateMessage(messageId, updates);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In EWS SOAP API, message updates were made using the &lt;code&gt;UpdateItem&lt;/code&gt; operation.&lt;br /&gt;
In Graph REST API, messages are updated using a &lt;code&gt;PATCH&lt;/code&gt; request:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;PATCH https://graph.microsoft.com/v1.0/me/messages/{messageId}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;and setting desired &lt;code&gt;Content-Type&lt;/code&gt; header and request body content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This operation requires &lt;code&gt;Mail.ReadWrite&lt;/code&gt; permission to be configured in Azure App Registration.&lt;br /&gt;
&lt;strong&gt;Note:&lt;/strong&gt; The &lt;code&gt;GraphClient.UpdateMessage()&lt;/code&gt; API will be available in upcoming 8.0 release (check-it out at &lt;a href="https://www.nuget.org/packages/Rebex.Graph/8.0.9392-rc.1"&gt;NuGet.org as RC1&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;em&gt;For details, see &lt;a href="https://learn.microsoft.com/en-us/graph/api/message-update"&gt;Update message&lt;/a&gt; in the Microsoft documentation.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="delete-messages"&gt;Deleting messages&lt;/h2&gt;
&lt;p&gt;With Rebex EWS, &lt;a href="https://www.rebex.net/ews/features/messages.aspx#delete"&gt;deleting messages&lt;/a&gt; looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate EWS client instance
var client = new Rebex.Net.Ews();
client.Connect(&amp;quot;outlook.office365.com&amp;quot;);
client.Login(token, EwsAuthentication.OAuth20);

// get the message ID
EwsItemId messageId = ...

// delete message
client.DeleteItem(messageId, EwsDeleteMode.Permanent);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With Rebex Graph, the code for &lt;a href="https://www.rebex.net/graph/features/messages.aspx#delete"&gt;deleting messages&lt;/a&gt; looks similar:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate Graph client instance
var client = new Rebex.Net.GraphClient();
client.Connect();
client.Login(token);

// get the message ID
GraphMessageId messageId = ...

// delete message
client.DeleteMessage(messageId, permanent: true);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In EWS SOAP API, the &lt;code&gt;DeleteItem&lt;/code&gt; operation supported soft and hard deletes.&lt;br /&gt;
In Graph REST API, messages are soft-deleted using a &lt;code&gt;DELETE&lt;/code&gt; request:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DELETE https://graph.microsoft.com/v1.0/me/messages/{messageId}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;And hard-deleted using a &lt;code&gt;POST&lt;/code&gt; request:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;POST https://graph.microsoft.com/v1.0/me/messages/{messageId}/permanentDelete&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This operation requires &lt;code&gt;Mail.ReadWrite&lt;/code&gt; permission to be configured in Azure App Registration.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;For more details about soft-delete see &lt;a href="https://learn.microsoft.com/en-us/graph/api/message-delete"&gt;Delete message&lt;/a&gt; and hard delete, see &lt;a href="https://learn.microsoft.com/en-us/graph/api/message-permanentdelete"&gt;Permanent delete&lt;/a&gt; in the Microsoft documentation.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="list-folders"&gt;Listing folders&lt;/h2&gt;
&lt;p&gt;With Rebex EWS, &lt;a href="https://www.rebex.net/ews/features/folders.aspx#list"&gt;listing folders&lt;/a&gt; looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate EWS client instance
var client = new Rebex.Net.Ews();
client.Connect(&amp;quot;outlook.office365.com&amp;quot;);
client.Login(token, EwsAuthentication.OAuth20);

// list folders in the root folder
var rootFolders = client.GetFolderList();

// list folders in the 'Inbox' folder
var inboxFolders = client.GetFolderList(EwsFolderId.Inbox);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With Rebex Graph, the code for &lt;a href="https://www.rebex.net/graph/features/folders.aspx#list"&gt;listing folders&lt;/a&gt; looks similar:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate Graph client instance
var client = new Rebex.Net.GraphClient();
client.Connect();
client.Login(token);

// list folders in the root folder
var rootFolders = client.GetFolderList();

// list folders in the 'Inbox' folder
var inboxFolders = client.GetFolderList(GraphFolderId.Inbox);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In EWS SOAP API, listing folders was done using the &lt;code&gt;FindFolder&lt;/code&gt; operation.&lt;br /&gt;
In Graph REST API, folders can be listed by requesting:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;GET https://graph.microsoft.com/v1.0/me/mailFolders&lt;/code&gt;&lt;br /&gt;
or&lt;br /&gt;
&lt;code&gt;GET https://graph.microsoft.com/v1.0/me/mailFolders/{folderId}/childFolders&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;For details, see &lt;a href="https://learn.microsoft.com/en-us/graph/api/user-list-mailfolders"&gt;List mail folders&lt;/a&gt; and &lt;a href="https://learn.microsoft.com/en-us/graph/api/mailfolder-list-childfolders"&gt;List child folders&lt;/a&gt; in the Microsoft documentation.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="create-folder"&gt;Creating folders&lt;/h2&gt;
&lt;p&gt;With Rebex EWS, &lt;a href="https://www.rebex.net/ews/features/folders.aspx#create-remove"&gt;creating folders&lt;/a&gt; looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate EWS client instance
var client = new Rebex.Net.Ews();
client.Connect(&amp;quot;outlook.office365.com&amp;quot;);
client.Login(token, EwsAuthentication.OAuth20);

// create new folder 'Orders' under 'Inbox'
EwsFolderId folderId = client.CreateFolder(EwsFolderId.Inbox, &amp;quot;Orders&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With Rebex Graph, the code for &lt;a href="https://www.rebex.net/graph/features/folders.aspx#create-remove"&gt;creating folders&lt;/a&gt; looks similar:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate Graph client instance
var client = new Rebex.Net.GraphClient();
client.Connect();
client.Login(token);

// create new folder 'Orders' under 'Inbox'
GraphFolderInfo folder = client.CreateFolder(GraphFolderId.Inbox, &amp;quot;Orders&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In EWS SOAP API, folders were created using the &lt;code&gt;CreateFolder&lt;/code&gt; operation.&lt;br /&gt;
In Graph REST API, folders can be created using &lt;code&gt;POST&lt;/code&gt; request:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;POST https://graph.microsoft.com/v1.0/me/mailFolders&lt;/code&gt;&lt;br /&gt;
or&lt;br /&gt;
&lt;code&gt;POST https://graph.microsoft.com/v1.0/me/mailFolders/{folderId}/childFolders&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;and setting &lt;code&gt;Content-Type: application/json&lt;/code&gt; header and request body content.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This operation requires &lt;code&gt;Mail.ReadWrite&lt;/code&gt; permission to be configured in Azure App Registration.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;For details, see &lt;a href="https://learn.microsoft.com/en-us/graph/api/user-post-mailfolders"&gt;Create mail folder&lt;/a&gt; and &lt;a href="https://learn.microsoft.com/en-us/graph/api/mailfolder-post-childfolders"&gt;Create child folder&lt;/a&gt; in the Microsoft documentation.&lt;/em&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id="delete-folder"&gt;Deleting folders&lt;/h2&gt;
&lt;p&gt;With Rebex EWS, &lt;a href="https://www.rebex.net/ews/features/folders.aspx#create-remove"&gt;deleting folders&lt;/a&gt; looks like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate EWS client instance
var client = new Rebex.Net.Ews();
client.Connect(&amp;quot;outlook.office365.com&amp;quot;);
client.Login(token, EwsAuthentication.OAuth20);

// get the folder ID
EwsFolderId folderId = ...

// delete folder
client.DeleteFolder(folderId);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;With Rebex Graph, the code for &lt;a href="https://www.rebex.net/graph/features/folders.aspx#create-remove"&gt;deleting folders&lt;/a&gt; looks similar:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;// create, connect and authenticate Graph client instance
var client = new Rebex.Net.GraphClient();
client.Connect();
client.Login(token);

// get the folder ID
GraphFolderId folderId = ...

// delete folder
client.DeleteFolder(folderId);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;In EWS SOAP API, folders were deleted using the &lt;code&gt;DeleteFolder&lt;/code&gt; operation.&lt;br /&gt;
In Graph REST API, folders can be deleted using &lt;code&gt;DELETE&lt;/code&gt; request:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;DELETE https://graph.microsoft.com/v1.0/me/mailFolders/{folderId}&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; This operation requires &lt;code&gt;Mail.ReadWrite&lt;/code&gt; permission to be configured in Azure App Registration.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;For details, see &lt;a href="https://learn.microsoft.com/en-us/graph/api/mailfolder-delete"&gt;Delete mail folder&lt;/a&gt; in the Microsoft documentation.&lt;/em&gt;&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Rebex .NET components 7.0.9313: Maintenance release</title>
			<link>https://blog.rebex.net/version-7-0-9313</link>
			<description>This is a maintenance release that brings minor fixes and enhancements.</description>
			<author>Martin Vobr</author>
			<guid>https://blog.rebex.net/version-7-0-9313</guid>
			<pubDate>Thu, 21 Aug 2025 00:00:00 GMT</pubDate>
			<content:encoded>&lt;h2 id="maintenance-release"&gt;Maintenance release&lt;/h2&gt;
&lt;p&gt;7.0.9313 is a hotfix release that resolves some minor issues and brings several improvements.&lt;/p&gt;
&lt;?# DownloadBox 
    title="Download Rebex Total Pack trial" 
    url="https://www.rebex.net/total-pack/download/" 
    imageUrl="/images/total-pack-m.png" 
/?&gt;
&lt;h3 id="list-of-changes"&gt;List of changes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;SFTP: Added CurrentFileBytesTotal to TransferProgressChanged event arguments.&lt;/li&gt;
&lt;li&gt;FTP: Added CurrentFileBytesTotal to TransferProgressChanged event arguments.&lt;/li&gt;
&lt;li&gt;File System: Fixed possible ArgumentNullException when file system provider is used after an event handler is unregistered from file system notifier.&lt;/li&gt;
&lt;li&gt;File System: Prevented internally handled NullReferenceException in implementation of VDirectory.Exists method.&lt;/li&gt;
&lt;li&gt;Mail: Added IgnoreRedundantAsn1Data option to MailSettings/MimeOptions.&lt;/li&gt;
&lt;li&gt;ZIP: Fixed missing logging for multi-file operations.&lt;/li&gt;
&lt;li&gt;ZIP: Improved handling of 'version needed to extract' field to increase support for ZIP archives created on various platforms.&lt;/li&gt;
&lt;li&gt;Networking: Prevented internal NullReferenceException when socket is closed and IO operation is in progress.&lt;/li&gt;
&lt;li&gt;TLS Core: Fixed obfuscated type names in debug logs.&lt;/li&gt;
&lt;li&gt;TLS Core: Fixed rare race condition between TLS 1.3 IO operations and shutdown/dispose logic.&lt;/li&gt;
&lt;li&gt;Cryptography: Added IgnoreRedundantData option to SignedData and EnvelopedData classes.&lt;/li&gt;
&lt;li&gt;Cryptography: Fixed NullReferenceException instead of InvalidOperationException in SignerInfo/KeyTransRecipientInfo and SignedData.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For complete version history, see the &lt;a href="https://www.rebex.net/total-pack/history.aspx#7.0.9313"&gt;release history&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="r6.18-available-as-well"&gt;R6.18 available as well&lt;/h2&gt;
&lt;p&gt;For customers who have not yet upgraded to version 7 of Rebex libraries, we published the
&lt;a href="https://www.rebex.net/kb/r6-release-history/#R6.18"&gt;R6.18 update&lt;/a&gt; with important fixes and enhancements.
Version R6.x will be supported until November 2025.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>US court ruled: ComponentPro libraries stolen from Rebex</title>
			<link>https://blog.rebex.net/us-court-ruled-componentpro-libraries-stolen-from-rebex</link>
			<description>If you are using counterfeit .NET libraries from ComponentPro, you should upgrade to the genuine Rebex version maintained by the real authors.</description>
			<author>Martin Vobr</author>
			<guid>https://blog.rebex.net/us-court-ruled-componentpro-libraries-stolen-from-rebex</guid>
			<pubDate>Thu, 22 May 2025 00:00:00 GMT</pubDate>
			<content:encoded>&lt;p&gt;Using ComponentPro? We've got news that might affect your codebase. It was actually Rebex code – and we proved it in court.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.courtlistener.com/docket/62987803/rebex-cr-v-dang/"&gt;&lt;strong&gt;ComponentPro&lt;/strong&gt; has lost copyright infringement lawsuit&lt;/a&gt; because they were selling .NET components based on the code copied from our &lt;strong&gt;&lt;a href="https://www.rebex.net/total-pack/"&gt;Rebex .NET libraries&lt;/a&gt;&lt;/strong&gt;. Almost the same APIs, same internals – just rebranded and sold as their own.
To hide the real authors, they changed the names of classes and some methods, but the vast majority of the code remains the same.
We took them to court – and &lt;strong&gt;we won&lt;/strong&gt;. Infringing company had to stop all business activities and Rebex acquired the &lt;a href="https://www.componentpro.com"&gt;ComponentPro.com&lt;/a&gt; domain.&lt;/p&gt;
&lt;h2 id="what-this-means-for-you"&gt;What this means for you&lt;/h2&gt;
&lt;p&gt;If you bought any of the following ComponentPro products, you're  using infringing software:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ultimate Studio Suite&lt;/li&gt;
&lt;li&gt;Network Expert Suite&lt;/li&gt;
&lt;li&gt;FTP Expert Suite&lt;/li&gt;
&lt;li&gt;Mail Expert Suite&lt;/li&gt;
&lt;li&gt;FTP &amp;amp; FTPS&lt;/li&gt;
&lt;li&gt;SFTP &amp;amp; SCP&lt;/li&gt;
&lt;li&gt;Terminal Emulation&lt;/li&gt;
&lt;li&gt;Mail Library&lt;/li&gt;
&lt;li&gt;SFTP Server&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A full breakdown of the case and affected libraries is available at &lt;a href="https://www.componentpro.com"&gt;www.componentpro.com&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="heres-the-fix"&gt;Here's the fix&lt;/h2&gt;
&lt;p&gt;If you bought from ComponentPro, you may not have known – but you're using code they had no right to sell. The code infringes on Rebex copyright.&lt;/p&gt;
&lt;p&gt;We're not here to call you out – we're here to help.&lt;br /&gt;
We're offering a &lt;strong&gt;discounted upgrade to the official Rebex libraries&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id="benefits-of-switching-to-the-genuine-version"&gt;Benefits of switching to the genuine version:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rebex.net/total-pack/history.aspx"&gt;Latest updates&lt;/a&gt;, many improvements and security fixes&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;real license&lt;/strong&gt; that enables you to legally use the library&lt;/li&gt;
&lt;li&gt;TLS 1.3 support, modern .NET compatibility&lt;/li&gt;
&lt;li&gt;Direct support from the actual authors of the code&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="what-to-do"&gt;What to do&lt;/h3&gt;
&lt;p&gt;Just &lt;a href="mailto:support&amp;#64;rebex.net"&gt;email us&lt;/a&gt; your original ComponentPro invoice. We'll handle the rest.&lt;br /&gt;
&lt;a href="https://www.rebex.net/company/contact/"&gt;https://www.rebex.net/company/contact/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let's get your codebase on solid ground – clean, legal, and supported.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Rebex .NET components 7.0.9209: Maintenance release</title>
			<link>https://blog.rebex.net/version-7-0-9209</link>
			<description>This is a maintenance release that brings several improvements and fixes</description>
			<author>Lukas Pokorny</author>
			<guid>https://blog.rebex.net/version-7-0-9209</guid>
			<pubDate>Wed, 23 Apr 2025 00:00:00 GMT</pubDate>
			<content:encoded>&lt;h2 id="support-for-rsa-public-key-format-from-pkcs-1"&gt;Support for RSA public key format from PKCS #1&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;SshPublicKey&lt;/code&gt; now supports the legacy RSA public key format specified by PKCS #1. This makes it possible to load keys that start with &lt;code&gt;-----BEGIN RSA PUBLIC KEY-----&lt;/code&gt; header.&lt;/p&gt;
&lt;h2 id="improved-error-handling-in-multi-file-operations"&gt;Improved error handling in multi-file operations&lt;/h2&gt;
&lt;p&gt;When information about a file or directory cannot be retrieved, a relevant exception with &lt;code&gt;ProblemType&lt;/code&gt; property set to &lt;code&gt;TransferProblemType.​CannotRetrieveItemInfo&lt;/code&gt; is raised instead of an 'internal error'.&lt;/p&gt;
&lt;h2 id="improved-imap-folder-info"&gt;Improved IMAP folder info&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;HasChildren&lt;/code&gt; and &lt;code&gt;HasNoChildren&lt;/code&gt; properties have been added to &lt;code&gt;ImapFolder&lt;/code&gt;, representing &lt;em&gt;\HasChildren&lt;/em&gt; and &lt;em&gt;\HasNoChildren&lt;/em&gt; folder list attributes.&lt;/p&gt;
&lt;h2 id="more-fixes-and-improvements"&gt;More fixes and improvements&lt;/h2&gt;
&lt;p&gt;For a detailed list of changes, see the &lt;a href="https://www.rebex.net/total-pack/history.aspx#7.0.9209"&gt;release history&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Rebex Buru SFTP Server 2.17.0: SSH configuration improvements</title>
			<link>https://blog.rebex.net/buru-sftp-release-2-17-0</link>
			<description>A new release of Rebex Buru SFTP Server</description>
			<author>Lukas Paluzga</author>
			<guid>https://blog.rebex.net/buru-sftp-release-2-17-0</guid>
			<pubDate>Thu, 10 Apr 2025 00:00:00 GMT</pubDate>
			<content:encoded>&lt;?# DownloadBox title="Download Buru SFTP Server"
    url="https://www.rebex.net/buru-sftp-server/download/"
    imageUrl="/images/buru-sftp-server-m.png"
/?&gt;
&lt;p&gt;We have released Rebex Buru SFTP Server v2.17.0. Here is an overview of changes, fixes and improvements.&lt;/p&gt;
&lt;h3 id="ssh-configuration-improvements"&gt;SSH configuration improvements&lt;/h3&gt;
&lt;h4 id="ssh-tunneling-configuration-changes-2.17.0"&gt;SSH tunneling configuration changes &lt;span class="version"&gt;(2.17.0)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;SSH tunnels have been supported since early versions of Buru SFTP Server, however, without any Web Admin configuration and prone to endpoint conflicts.&lt;/p&gt;
&lt;p&gt;We fixed the conflict issue and simplified the configuration by moving it from &lt;code&gt;sshTunneling&lt;/code&gt; section to &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/configuration/config-yaml/bindings/"&gt;&lt;code&gt;bindings&lt;/code&gt;&lt;/a&gt; section, on the same level as SFTP, SCP/Shell and FTP protocols:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-yaml"&gt;# before
sshTunneling:
  enabled: true
  bindings:
    - { port: 22, ipAddress: 0.0.0.0 }

# after
bindings:
  - { port: 22, ipAddress: 0.0.0.0, sshTunnel: true, ... }

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;SSH tunneling can now be also enabled or disabled in the Web administration and is disabled by default.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Warning is shown on startup when &lt;code&gt;sshTunneling&lt;/code&gt; section is present in the configuration file, its values are now ignored.&lt;/em&gt;&lt;/p&gt;
&lt;h4 id="ssh-shell-configuration-defaults-now-configurable-using-web-administration-2.17.0"&gt;SSH shell configuration defaults now configurable using Web administration&lt;span class="version"&gt; (2.17.0)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;Default values for SSH shell home directory and SSH shell executable path are now configurable using Web administration. These values can be overridden per user.&lt;/p&gt;
&lt;h3 id="improved-support-for-displaying-users-public-keys-2.17.0"&gt;Improved support for displaying user's public keys &lt;span class="version"&gt;(2.17.0)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;Based on a client's feedback, we improved the way user's public SSH keys can be displayed:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;User's details in Web administration now show the user's public key with SSH algorithm prefix to make it easier to re-import to other applications, e.g. &lt;code&gt;authorized_keys&lt;/code&gt; file.&lt;/li&gt;
&lt;li&gt;Output of &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/burusftp-cli-commands/user-inspect/"&gt;&lt;code&gt;burusftp user inspect&lt;/code&gt;&lt;/a&gt; command now also contains full SSH public key, with SSH algorithm prefix.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="minor-changes-and-fixes"&gt;Minor changes and fixes&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Web Admin
&lt;ul&gt;
&lt;li&gt;Fixed an issue when SSH shell settings were sometimes not editable &lt;span class="version"&gt;(2.16.1)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Installer
&lt;ul&gt;
&lt;li&gt;Fixed missing prompt to remove all configuration files when uninstalling. &lt;span class="version"&gt;(2.16.1)&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;For a complete list of fixes and improvements, see the &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/release-notes"&gt;Release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can report issues and submit feature requests on our &lt;a href="https://github.com/rebexnet/buru-sftp-server/"&gt;Github issue tracker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For discussions and specific problems, please continue using our &lt;a href="https://forum.rebex.net/"&gt;support forum&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Rebex Buru SFTP Server 2.16.0: Technological update</title>
			<link>https://blog.rebex.net/buru-sftp-release-2-16-0</link>
			<description>A new release of Rebex Buru SFTP Server</description>
			<author>Lukas Paluzga</author>
			<guid>https://blog.rebex.net/buru-sftp-release-2-16-0</guid>
			<pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate>
			<content:encoded>&lt;?# DownloadBox 
    title="Download Buru SFTP Server 2.16.0" 
    url="https://www.rebex.net/buru-sftp-server/download/" 
    imageUrl="/images/buru-sftp-server-m.png" 
/?&gt;
&lt;p&gt;We have released Rebex Buru SFTP Server v2.16.0. Here is an overview of changes, fixes and improvements.&lt;/p&gt;
&lt;h1 id="technological-update"&gt;Technological Update&lt;/h1&gt;
&lt;p&gt;Buru SFTP Server is built on &lt;strong&gt;.NET platform&lt;/strong&gt;, which provides the foundation for its security and reliability.
With this release, we've made several key upgrades to ensure compatibility with the current .NET version and support long-term stability for our users.&lt;/p&gt;
&lt;p&gt;In alignment with Microsoft's .NET lifecycle, we have transitioned Buru SFTP Server to &lt;strong&gt;.NET 8&lt;/strong&gt; (LTS), as &lt;strong&gt;.NET 6 support ended on November 12, 2024&lt;/strong&gt;.
You can read more about this change in the official &lt;a href="https://dotnet.microsoft.com/platform/support/policy/dotnet-core"&gt;.NET 6 support policy&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;This transition enables us to continue delivering the latest .NET security updates to our users. However, it also means that &lt;strong&gt;Windows 7 and Windows 8 are no longer supported from this version on&lt;/strong&gt; as these are not officially supported by .NET 8.
For more details on .NET 8, including its support timeline, visit the official &lt;a href="https://dotnet.microsoft.com/en-us/platform/support/policy/dotnet-core"&gt;.NET 8 support page&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="library-upgrades"&gt;Library Upgrades&lt;/h3&gt;
&lt;p&gt;In addition to updating our framework, we’ve also upgraded the libraries that Buru SFTP Server relies on, including advanced logging features powered by &lt;strong&gt;Serilog&lt;/strong&gt;.&lt;/p&gt;
&lt;table class="table"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Library&lt;/th&gt;
&lt;th&gt;&amp;lt; 2.16.0 (previous)&lt;/th&gt;
&lt;th&gt;&amp;gt;= 2.16.0 (current)&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;.NET&lt;/td&gt;
&lt;td&gt;.NET 6.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;.NET 8.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serilog&lt;/td&gt;
&lt;td&gt;2.12&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.1&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serilog.Extensions.Hosting&lt;/td&gt;
&lt;td&gt;7.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serilog.Extensions.Logging&lt;/td&gt;
&lt;td&gt;7.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serilog.Formatting.Compact&lt;/td&gt;
&lt;td&gt;1.1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serilog.Settings.Configuration&lt;/td&gt;
&lt;td&gt;7.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;8.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serilog.Sinks.ColoredConsole&lt;/td&gt;
&lt;td&gt;3.0.1&lt;/td&gt;
&lt;td&gt;&lt;em&gt;removed&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serilog.Sinks.Console&lt;/td&gt;
&lt;td&gt;4.1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serilog.Sinks.Debug&lt;/td&gt;
&lt;td&gt;2.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serilog.Sinks.EventLog&lt;/td&gt;
&lt;td&gt;3.1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;4.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serilog.Sinks.File&lt;/td&gt;
&lt;td&gt;5.0&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;6.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serilog.Sinks.RollingFile&lt;/td&gt;
&lt;td&gt;3.3&lt;/td&gt;
&lt;td&gt;&lt;em&gt;removed&lt;/em&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Serilog.Sinks.TextWriter&lt;/td&gt;
&lt;td&gt;2.1&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.0&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;For more in-depth information on these features, refer to the &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/how-to-guides/server-configuration/how-to-configure-logging/"&gt;Buru SFTP Server logging documentation&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="ftp-passive-mode-port-and-external-address-configuration-2.15.5"&gt;FTP passive mode port and external address configuration &lt;span class="version"&gt;(2.15.5)&lt;/span&gt;&lt;/h3&gt;
&lt;p&gt;In FTP passive mode, the client initiates both the command and data connections to the server.
This approach is particularly beneficial when the client is behind a firewall or NAT (Network Address Translation) device, as it avoids the complications associated with incoming connections from the server.&lt;/p&gt;
&lt;p&gt;Previously, the server would choose ports for passive mode connections from the &lt;a href="https://learn.microsoft.com/en-us/troubleshoot/windows-server/networking/default-dynamic-port-range-tcpip-chang"&gt;dynamic port range&lt;/a&gt; assigned by the operating system. This range typically spans from 49152 to 65535.&lt;/p&gt;
&lt;p&gt;With the latest release of Buru SFTP Server, administrators can now configure the FTP passive mode port range and specify the external IP address directly within the server settings.&lt;/p&gt;
&lt;p&gt;The configuration can be accessed through the Web Administration interface under the &lt;strong&gt;FTP Settings&lt;/strong&gt; section or &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/configuration/config-yaml/ftp-bindings/"&gt;configured directly in the &lt;code&gt;config.yaml&lt;/code&gt; file&lt;/a&gt;.&lt;/p&gt;
&lt;img class="mx-auto d-block border" alt="WA FTP passive mode port and external address configuration" src="/images/2025/buru-2.16.0-ftpports.png" /&gt;
&lt;h3 id="bug-fixes"&gt;Bug fixes&lt;/h3&gt;
&lt;h4 id="fixed-user-database-issue-when-some-users-couldnt-be-loaded-or-updated-2.15.6"&gt;Fixed user database issue when some users couldn’t be loaded or updated &lt;span class="version"&gt;(2.15.6)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;We addressed an issue where user retrieval from the internal database sometimes failed due to indexing issues within the database, causing unpredictable behaviors and errors.&lt;/p&gt;
&lt;p&gt;This manifested in various ways, including:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Inability to load specific user details&lt;/li&gt;
&lt;li&gt;Failed attempts to delete certain users&lt;/li&gt;
&lt;li&gt;Misleading error messages when creating a new user with an existing username&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We have temporarily resolved this issue by removing the problematic index.
However, a permanent solution will be implemented in the next major release when the database library is updated.
The current version does not include a full fix due to the potential for breaking changes.&lt;/p&gt;
&lt;h4 id="added-no-cache-http-header-to-web-admin-responses-to-prevent-displaying-outdated-content-2.15.6"&gt;Added &lt;code&gt;no-cache&lt;/code&gt; HTTP header to Web Admin responses to prevent displaying outdated content &lt;span class="version"&gt;(2.15.6)&lt;/span&gt;&lt;/h4&gt;
&lt;p&gt;The Microsoft Edge browser has been observed to load content directly from its cache without checking for updates (e.g., using &lt;code&gt;If-Modified-Since&lt;/code&gt;), unlike other browsers.
This behavior can lead to users viewing outdated content.&lt;/p&gt;
&lt;p&gt;To address this, we added the &lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control"&gt;&lt;code&gt;no-cache&lt;/code&gt;&lt;/a&gt; directive in the HTTP headers, instructing browsers to always verify with the server before using a cached page version.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;For a complete list of fixes and improvements, see the &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/release-notes/"&gt;Release notes&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You can report issues and submit feature requests on our &lt;a href="https://github.com/rebexnet/buru-sftp-server/"&gt;Github issue tracker&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For discussions and specific problems, please continue using our &lt;a href="https://forum.rebex.net/"&gt;support forum&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>New Rebex prices for 2025</title>
			<link>https://blog.rebex.net/new-prices-2025</link>
			<description>New prices for .NET libraries and Buru SFTP Server effective as of May 1st, 2025.</description>
			<author>Martin Vobr</author>
			<guid>https://blog.rebex.net/new-prices-2025</guid>
			<pubDate>Wed, 29 Jan 2025 00:00:00 GMT</pubDate>
			<content:encoded>&lt;h2 id="why-we-are-changing-prices"&gt;Why we are changing prices&lt;/h2&gt;
&lt;p&gt;For more than 22 years, we’ve been committed to delivering reliable,
high-quality .NET libraries to help developers like you deliver complex
projects with ease. Over the years, we’ve made
&lt;a href="https://blog.rebex.net/tags/New-releases?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;significant improvements&lt;/a&gt;
to our products, introduced new features and maintained exceptional support.
After keeping our prices flat for the past 6 years, costs have increased to the point
where a price adjustment is needed. Increased prices will allow us to continue improving
our products and to continue supporting the software in the years to come.&lt;/p&gt;
&lt;h2 id="effective-date"&gt;Effective date&lt;/h2&gt;
&lt;p&gt;Price changes are effective as of &lt;strong&gt;May 1st, 2025&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="new-pricing"&gt;New pricing&lt;/h2&gt;
&lt;table class="table"&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Product&lt;/th&gt;
&lt;th&gt;New license&lt;/th&gt;
&lt;th&gt;Renewal&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;.NET library packs&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/file-transfer-pack/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;File Transfer Pack&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$999&lt;/td&gt;
&lt;td&gt;$499&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/mail-pack/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;Mail Pack&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$499&lt;/td&gt;
&lt;td&gt;$249&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/ssh-pack/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;SSH Pack&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$1,299&lt;/td&gt;
&lt;td&gt;$649&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/total-pack/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;Total Pack&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$1,499&lt;/td&gt;
&lt;td&gt;$749&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Individual .NET libraries&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/ews/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;EWS&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$299&lt;/td&gt;
&lt;td&gt;$149&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/file-server/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;File Server&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$499&lt;/td&gt;
&lt;td&gt;$249&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/ftp-ssl.net/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;FTP&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$499&lt;/td&gt;
&lt;td&gt;$249&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/graph/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;Graph&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$299&lt;/td&gt;
&lt;td&gt;$149&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/https/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;HTTPS&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$499&lt;/td&gt;
&lt;td&gt;$249&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/imap/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;IMAP&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$299&lt;/td&gt;
&lt;td&gt;$149&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/msg/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;MSG&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$299&lt;/td&gt;
&lt;td&gt;$149&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/pop3/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;POP3&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$299&lt;/td&gt;
&lt;td&gt;$149&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/security.net/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;Security&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$199&lt;/td&gt;
&lt;td&gt;$99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/sftp.net/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;SFTP&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$499&lt;/td&gt;
&lt;td&gt;$249&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/smtp/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;SMTP&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$199&lt;/td&gt;
&lt;td&gt;$99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/ssh-shell/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;SSH Shell&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$999&lt;/td&gt;
&lt;td&gt;$499&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/syslog/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;Syslog&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$299&lt;/td&gt;
&lt;td&gt;$149&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/time.net/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;Time&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$199&lt;/td&gt;
&lt;td&gt;$99&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/tls/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;TLS&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$999&lt;/td&gt;
&lt;td&gt;$499&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/websocket/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;WebSocket&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$499&lt;/td&gt;
&lt;td&gt;$249&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/zip.net/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;ZIP&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$299&lt;/td&gt;
&lt;td&gt;$149&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Servers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://rebex.net/buru-sftp-server/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog"&gt;Buru SFTP Server&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;$399&lt;/td&gt;
&lt;td&gt;$199&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;em&gt;(Prices for 1 developer / 1 server)&lt;/em&gt;&lt;/p&gt;
&lt;h2 id="current-customers"&gt;Current customers&lt;/h2&gt;
&lt;p&gt;We understand that price changes are never easy, and we’re committed to making this transition as smooth as possible.&lt;/p&gt;
&lt;h3 id="days-to-get-new-licenses-at-the-old-price"&gt;90 days to get new licenses at the old price&lt;/h3&gt;
&lt;p&gt;The prices will change 90 days from the publication of this announcement.
If you are considering purchasing additional licenses, you can do so in advance
and pay the current price.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.rebex.net/shop/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog" class="btn btn-primary"&gt;Buy new licenses&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="lock-your-renewal-prices-for-up-to-3-years"&gt;Lock your renewal prices for up to 3 years&lt;/h3&gt;
&lt;p&gt;You can lock in your current renewal pricing for up to 3 years if you
renew your current support contract before the price changes.
This applies if you choose to renew for multiple years.
If you still have a few months left on your support contract,
renew it before the price change on May 1st.
Those additional years will be added to the end of your current contract.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.rebex.net/account/?utm_medium=internal&amp;amp;utm_campaign=pricing-2025-blog" class="btn btn-primary"&gt;Renew your support contract&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="contact-support"&gt;Contact support&lt;/h2&gt;
&lt;p&gt;We understand that you may have questions regarding the price change.
Please feel free to contact us at
&lt;a href='mailto:support&amp;#64;rebex.net?subject=Rebex price change 2025'&gt;support&amp;#64;rebex.net&lt;/a&gt;.
We're always here to help.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Rebex .NET components 7.0.9147: Maintenance release</title>
			<link>https://blog.rebex.net/version-7-0-9147</link>
			<description>This is a maintenance release that brings a number of improvements and fixes</description>
			<author>Lukas Pokorny</author>
			<guid>https://blog.rebex.net/version-7-0-9147</guid>
			<pubDate>Sun, 19 Jan 2025 00:00:00 GMT</pubDate>
			<content:encoded>&lt;h2 id="mitigated-potential-timing-attack-in-xtsaes"&gt;Mitigated potential timing attack in XTS/AES&lt;/h2&gt;
&lt;p&gt;The tweak chunk preparation algorithm from IEEE 1619-2018 standard, used in &lt;code&gt;Xts&lt;/code&gt;, &lt;code&gt;XtsStream&lt;/code&gt; and &lt;code&gt;FileEncryption&lt;/code&gt; classes, was found to be potentially susceptible to timing attacks. This release of Rebex Security / Rebex Total Packs resolves the issue.&lt;/p&gt;
&lt;h2 id="improved-ftp-compatibility"&gt;Improved FTP compatibility&lt;/h2&gt;
&lt;p&gt;This release adds a workarounds for instances of HGFTP server that issue badly-formatted PWD response.&lt;/p&gt;
&lt;h2 id="tested-with-windows-11-24h2.net-9.0.1-and.net-8.0.12"&gt;Tested with Windows 11 24H2, .NET 9.0.1 and .NET 8.0.12&lt;/h2&gt;
&lt;p&gt;All Rebex libraries have been tested on latest versions of Windows and .NET.&lt;/p&gt;
&lt;h2 id="more-fixes-and-improvements"&gt;More fixes and improvements&lt;/h2&gt;
&lt;p&gt;For a detailed list of changes, see the &lt;a href="https://www.rebex.net/total-pack/history.aspx#7.0.9147"&gt;release history&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Rebex .NET components 7.0.9083: Support for .NET 9</title>
			<link>https://blog.rebex.net/version-7-0-9083</link>
			<description>This release adds support for .NET 9, the latest iteration of .NET platform.</description>
			<author>Lukas Pokorny</author>
			<guid>https://blog.rebex.net/version-7-0-9083</guid>
			<pubDate>Tue, 12 Nov 2024 00:00:00 GMT</pubDate>
			<content:encoded>&lt;h2 id="support-for.net-9"&gt;Support for .NET 9&lt;/h2&gt;
&lt;p&gt;This release adds a new set of binaries targeting &lt;a href="https://dotnet.microsoft.com/en-us/download/dotnet/9.0"&gt;.NET 9&lt;/a&gt;.
All &lt;a href="https://github.com/dotnet/core/blob/main/release-notes/9.0/supported-os.md"&gt;.NET 9 platforms&lt;/a&gt; are supported:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Windows (x64, x86, ARM64)&lt;/li&gt;
&lt;li&gt;Linux (x64, ARM32, ARM64)&lt;/li&gt;
&lt;li&gt;Android (x64, ARM32, ARM64)&lt;/li&gt;
&lt;li&gt;macOS (ARM64, x64)&lt;/li&gt;
&lt;li&gt;iOS/iPadOS/tvOS (ARM64)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Of course, we still support earlier versions of .NET as well, including .NET Framework 3.5-4.8.1 and .NET 5-8.
For more information about supported platforms, see our &lt;a href="https://www.rebex.net/kb/framework-support/"&gt;framework support chart&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="rebex-ftpssl-renamed-to-rebex-ftp"&gt;Rebex FTP/SSL renamed to Rebex FTP&lt;/h2&gt;
&lt;p&gt;We dropped the old 'SSL' part from the name of &lt;a href="https://www.rebex.net/ftp-ssl.net/"&gt;Rebex FTP library&lt;/a&gt;.
In 2024, referring to TLS as 'SSL' no longer made sense. Of course, Rebex FTP still supports TLS.
FTP over SSL 3.0 can be enabled as well, although it's discouraged because SSL is no longer secure and has been deprecated years ago.&lt;/p&gt;
&lt;h2 id="and-more"&gt;And more...&lt;/h2&gt;
&lt;p&gt;For a detailed list of changes, see the &lt;a href="https://www.rebex.net/total-pack/history.aspx#7.0.9083"&gt;release history&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="r6.17-available-as-well"&gt;R6.17 available as well&lt;/h2&gt;
&lt;p&gt;For customers who have not yet upgraded to version 7 of Rebex libraries,
we published the &lt;a href="https://www.rebex.net/kb/r6-release-history/#R6.17"&gt;R6.17 update&lt;/a&gt; with important fixes and enhancements.
Version R6.x will be supported until November 2025.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>New component: Rebex Graph - client API for MS Graph</title>
			<link>https://blog.rebex.net/graph-library</link>
			<description>Rebex Graph is a .NET library for accessing Microsoft 365 (Exchange Online) using Microsoft Graph API</description>
			<author>Lukas Pokorny</author>
			<guid>https://blog.rebex.net/graph-library</guid>
			<pubDate>Mon, 14 Oct 2024 00:00:00 GMT</pubDate>
			<content:encoded>&lt;p&gt;&lt;a href="https://www.rebex.net/graph/"&gt;Rebex Graph&lt;/a&gt; is a .NET library for accessing Microsoft 365 (Exchange Online)
using Microsoft Graph API. It makes it possible to send, receive, list and search e-mail messages.
It supports TLS 1.3/1.2 and S/MIME on all recent .NET platforms (including .NET Framework 3.5-4.8 and .NET 6.0-8.0).&lt;/p&gt;
&lt;p&gt;&lt;img src="/images/2024/graph-oauth2-office365.png" class="img-fluid" alt="Sample Graph app with OAuth 2.0" /&gt;&lt;/p&gt;
&lt;h2 id="easy-to-use-api"&gt;Easy-to-use API&lt;/h2&gt;
&lt;p&gt;With Rebex Graph's simple API, working with e-mails in Microsoft's cloud is easy:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-csharp"&gt;var client = new Rebex.Net.GraphClient();

// connect and authenticate to Exchange Online (Microsoft 365) server
client.Connect();
client.Login(token);

// get list of top 10 unread messages in Inbox and show their headers
var page = new GraphPageView(0, 10);
var unread = GraphMessageSearchParameter.IsRead(false);
var list = client.Search(GraphFolderId.Inbox, page, unread);

foreach (var info in list)
{
    Console.WriteLine(&amp;quot;{0}: {1}&amp;quot;, info.ReceivedDate, info.Subject);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Having troubles with setting up client access for your app in Microsoft's Azure?
Check out our extensive blog posts that come with working sample code:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://blog.rebex.net/office365-graph-oauth-delegated"&gt;Rebex Graph with OAuth 2.0 in delegated mode (with a signed-in user)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.rebex.net/office365-graph-oauth-unattended"&gt;Rebex Graph with OAuth 2.0 in unattended (app-only) mode&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rebex Graph is available as a &lt;a href="https://www.rebex.net/graph/buy/"&gt;standalone package&lt;/a&gt;,
or as a part of &lt;a href="https://www.rebex.net/total-pack/"&gt;Rebex Total Pack&lt;/a&gt; or &lt;a href="https://www.rebex.net/mail-pack/"&gt;Rebex Mail Pack&lt;/a&gt;.
If you already have an active support contract for Rebex Total Pack or Rebex Mail Pack (formerly Rebex Secure Mail),
you can &lt;a href="https://www.rebex.net/protected/Download.aspx"&gt;download the full version&lt;/a&gt; including the Graph library now!&lt;/p&gt;
&lt;p&gt;See also: &lt;a href="https://www.rebex.net/graph/"&gt;Rebex Graph homepage&lt;/a&gt; |
&lt;a href="https://www.rebex.net/graph/features/"&gt;Features&lt;/a&gt; |
&lt;a href="https://www.rebex.net/graph/download.aspx"&gt;Download trial&lt;/a&gt; |
&lt;a href="https://www.rebex.net/graph/buy/"&gt;Pricing from $199&lt;/a&gt;&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Secure Mail becomes Mail Pack. Mail libraries available separately.</title>
			<link>https://blog.rebex.net/new-rebex-mail-pack</link>
			<description>Mail libraries are available individually at a lower price. The Rebex Secure Mail has been extended and renamed to Rebex Mail Pack.</description>
			<author>Jan Sotola</author>
			<guid>https://blog.rebex.net/new-rebex-mail-pack</guid>
			<pubDate>Thu, 10 Oct 2024 00:00:00 GMT</pubDate>
			<content:encoded>&lt;p&gt;&lt;a href='https://www.rebex.net/mail-pack/'&gt;&lt;img src='/images/2024/screenshot-mail-pack-content.png'&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;We are introducing new packaging of Rebex email libraries:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Individual libs&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rebex.net/ews/"&gt;EWS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rebex.net/graph/"&gt;Graph&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rebex.net/imap/"&gt;IMAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rebex.net/pop3/"&gt;POP3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rebex.net/smtp/"&gt;SMTP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rebex.net/msg/"&gt;MSG&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;All mail libraries&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rebex.net/mail-pack"&gt;Mail Pack&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="why-are-we-making-this-change"&gt;Why are we making this change?&lt;/h2&gt;
&lt;p&gt;In the past, &lt;em&gt;most&lt;/em&gt; of Rebex mail libraries were available together in Rebex Secure Mail. However, some users needed only a part of the functionality.&lt;/p&gt;
&lt;p&gt;Now, it is possible to buy any of these libraries &lt;strong&gt;separately&lt;/strong&gt; at a lower price, or  &lt;strong&gt;all together&lt;/strong&gt; for the same price.&lt;/p&gt;
&lt;p&gt;We've also added the MSG library to 'Secure Mail', and renamed the bundle to 'Mail Pack'. This makes the naming consistent with our other .NET library packages.&lt;/p&gt;
&lt;h2 id="i-already-have-a-rebex-secure-mail-license.what-changes-for-me"&gt;I already have a Rebex Secure Mail license. What changes for me?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;You've been upgraded to Rebex Mail Pack for free.&lt;/li&gt;
&lt;li&gt;You can use the &lt;a href="https://www.rebex.net/msg/"&gt;MSG library&lt;/a&gt; as well.&lt;/li&gt;
&lt;li&gt;API and DLLs stay the same. No change is needed in your code.&lt;/li&gt;
&lt;li&gt;When renewing your Rebex Secure Mail support contract, you will be offered a Rebex Mail Pack renewal.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="introductory-pricing"&gt;Introductory pricing&lt;/h2&gt;
&lt;p&gt;For a limited time, the price of Rebex Mail Pack is the same as for Rebex Secure Mail ($299 for a new single developer license, $149 for renewal).
Individual component are priced lower (starting at $199 or $99 for SMTP).&lt;/p&gt;
&lt;h2 id="questions"&gt;Questions?&lt;/h2&gt;
&lt;p&gt;If you have any questions or comments, please contact us at &lt;a href="mailto:support&amp;#64;rebex.net"&gt;support&amp;#64;rebex.net&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Rebex Buru SFTP Server 2.15.4: FTP protocol support.</title>
			<link>https://blog.rebex.net/buru-sftp-release-2-15-4</link>
			<description>A new release of Rebex Buru SFTP Server with FTP protocol support and more...</description>
			<author>Lukas Paluzga</author>
			<guid>https://blog.rebex.net/buru-sftp-release-2-15-4</guid>
			<pubDate>Thu, 10 Oct 2024 00:00:00 GMT</pubDate>
			<content:encoded>&lt;?# DownloadBox 
    title="Download Buru SFTP Server 2.15.4" 
    url="https://www.rebex.net/buru-sftp-server/download/" 
    imageUrl="/images/buru-sftp-server-m.png" 
/?&gt;
&lt;p&gt;We have released Rebex Buru SFTP Server v2.15.4. Here is an overview of changes, fixes and improvements.&lt;/p&gt;
&lt;h2 id="ftp-protocol-support"&gt;FTP protocol support&lt;/h2&gt;
&lt;p&gt;Buru SFTP Server now supports &lt;a href="https://www.rebex.net/buru-sftp-server/features/protocols/ftp/"&gt;FTP and FTPS protocol&lt;/a&gt;, in addition to already supported
&lt;a href="https://www.rebex.net/buru-sftp-server/features/protocols/sftp/"&gt;SFTP&lt;/a&gt;,
&lt;a href="https://www.rebex.net/buru-sftp-server/features/protocols/scp/"&gt;SCP&lt;/a&gt; and
&lt;a href="https://www.rebex.net/buru-sftp-server/features/protocols/ssh-shell/"&gt;SSH&lt;/a&gt; protocols.
FTP protocol is disabled by default and can be enabled either for individual users or for all users at once.
Each FTP endpoint can be assigned a separate set of X.509 certificates. Both implicit and explicit FTPS modes are supported.&lt;/p&gt;
&lt;h2 id="buru-sftp-command-prompt-now-asks-for-administrator-privileges-by-default"&gt;Buru SFTP Command Prompt now asks for administrator privileges by default&lt;/h2&gt;
&lt;p&gt;This has been source of confusion for users as running most &lt;code&gt;burusftp&lt;/code&gt; commands without administrator privileges would fail with permission errors.&lt;/p&gt;
&lt;h2 id="minor-fixes-and-improvements"&gt;Minor fixes and improvements&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;2.14.5&lt;/li&gt;
  &lt;ul&gt;
      &lt;li&gt;Fixed errors when parsing some configuration IP addresses with leading or trailing whitespace.&lt;/li&gt;
      &lt;li&gt;Web Admin - added SSH port placeholder on SSH endpoints page.&lt;/li&gt;
      &lt;li&gt;Web Admin - fixed Maximum renegotiation threshold caption on Additional SSH settings page.&lt;/li&gt;
      &lt;li&gt;Web Admin - fixed minor UI issue when typing a file path containing a space character.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;li&gt;2.15.0&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Initial &lt;a href="https://www.rebex.net/buru-sftp-server/features/protocols/ftp/"&gt;&lt;strong&gt;FTP protocol support&lt;/strong&gt;&lt;/a&gt;:
    &lt;ul&gt;
        &lt;li&gt;Added support for FTP protocol (plain FTP, implicit and explicit FTPS).&lt;/li&gt;
        &lt;li&gt;Disabled by default. Can be enabled globally in &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/configuration/config-yaml/ftp/"&gt;configuration&lt;/a&gt; or &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/burusftp-cli-commands/user-update/"&gt;per user&lt;/a&gt;.&lt;/li&gt;
        &lt;li&gt;Each FTPS endpoint can be configured with different certificate(s).&lt;/li&gt;
    &lt;/ul&gt;
    &lt;li&gt;Added user field ’note’ for user comments.&lt;/li&gt;
    &lt;li&gt;Installer - &lt;em&gt;Buru SFTP Command Prompt&lt;/em&gt; now runs with administrator privileges by default.&lt;/li&gt;
    &lt;li&gt;Removed server configuration parameters &lt;code&gt;passwordPolicy&lt;/code&gt; and &lt;code&gt;usernamePattern&lt;/code&gt;. These parameters have been deprecated since &lt;a href="#110-2019-02-07"&gt;v1.1.0&lt;/a&gt;.&lt;/li&gt;
    &lt;li&gt;Web Admin - configuration pages are now accessible when configuration file is invalid but readable.&lt;/li&gt;
    &lt;li&gt;Fixed &lt;code&gt;burusftp user key delete -F &amp;lt;fingerprint&amp;gt;&lt;/code&gt; behavior with &lt;code&gt;SHA-256:&lt;/code&gt; prefix.&lt;/li&gt;
    &lt;li&gt;Updated &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/how-to-guides/server-configuration/how-to-configure-logging/#nuget-versions"&gt;Serilog logging libraries&lt;/a&gt;.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;li&gt;2.15.1&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Fixed an issue where username leading/trailing whitespace was not trimmed when creating a user.&lt;/li&gt;
    &lt;li&gt;Web Admin - fixed error when loading user detail page for user with special characters in username.&lt;/li&gt;
    &lt;li&gt;Web Admin - fixed error message when adding user with existing username.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;li&gt;2.15.2&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Web Admin - fixed browser cache issue after application upgrade.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;li&gt;2.15.3&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Web Admin - fixed error when loading FTP settings page.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;li&gt;2.15.4&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Added &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/burusftp-cli-commands/certgen/"&gt;&lt;code&gt;burusftp certgen&lt;/code&gt;&lt;/a&gt; command to generate self-signed X.509 (TLS) certificates. This is an alias for &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/burusftpwa-cli-commands/certgen/"&gt;&lt;code&gt;burusftpwa certgen&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt;
    &lt;li&gt;Web Admin - FTP certificate group can now be renamed.&lt;/li&gt;
    &lt;li&gt;Web Admin - fixed FTP binding custom certificate group not being saved properly.&lt;/li&gt;
  &lt;/ul&gt;
&lt;/ul&gt;
&lt;p&gt;For complete list of fixes and improvements
see &lt;a href="https://www.rebex.net/doc/buru-sftp-server/latest/reference/release-notes/"&gt;Release notes&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="issues-and-feature-requests-on-github"&gt;Issues and feature requests on Github&lt;/h2&gt;
&lt;p&gt;You can report issues and submit feature requests on
our &lt;a href="https://github.com/rebexnet/buru-sftp-server/"&gt;Github issue tracker&lt;/a&gt;.
For discussions and specific problems please keep using our &lt;a href="https://forum.rebex.net/"&gt;support forum&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
		</item>
	</channel>
</rss>