﻿<?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>Fri, 13 Mar 2026 11:31:21 GMT</pubDate>
		<lastBuildDate>Fri, 13 Mar 2026 11:31:21 GMT</lastBuildDate>
		<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/features/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/features/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/configuration/config/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/configuration/config/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/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 .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;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/configuration/config/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/management/burusftp/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/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 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/features/logging/#advanced-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/configuration/config/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/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>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/configuration/config/ftp/"&gt;configuration&lt;/a&gt; or &lt;a href="https://www.rebex.net/doc/buru-sftp-server/management/burusftp/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/features/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/management/burusftp/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/web-administration/burusftpwa/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/buru-sftp-server/doc/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>
		<item>
			<title>Rebex .NET components 7.0.9048: Maintenance release</title>
			<link>https://blog.rebex.net/version-7-0-9048</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-9048</guid>
			<pubDate>Tue, 08 Oct 2024 00:00:00 GMT</pubDate>
			<content:encoded>&lt;h2 id="rebex-secure-mail-becomes-rebex-mail-pack"&gt;Rebex Secure Mail becomes Rebex Mail Pack&lt;/h2&gt;
&lt;p&gt;Rebex Secure Mail, our package of Rebex mail libraries, is now available as &lt;a href="https://blog.rebex.net/new-rebex-mail-pack"&gt;Rebex Mail Pack&lt;/a&gt;.
In addition to IMAP, POP3, EWS, SMTP, MIME and S/MIME, it now also includes libraries for Outlook MSG format and for MS Graph API.&lt;/p&gt;
&lt;p&gt;Libraries for individual mail protocols are also available separately:
&lt;a href="https://www.rebex.net/imap/"&gt;IMAP&lt;/a&gt;,
&lt;a href="https://www.rebex.net/pop3/"&gt;POP3&lt;/a&gt;,
&lt;a href="https://www.rebex.net/smtp/"&gt;SMTP&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;,
&lt;a href="https://www.rebex.net/msg/"&gt;MSG&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="improved-graph-api"&gt;Improved Graph API&lt;/h2&gt;
&lt;p&gt;Our client-side &lt;a href="https://www.rebex.net/graph/"&gt;MS Graph library&lt;/a&gt; now supports &lt;code&gt;CreateFolder&lt;/code&gt; and &lt;code&gt;DeleteFolder&lt;/code&gt; methods.
It also adds &lt;code&gt;Settings.MarkDownloadedMessageAsRead&lt;/code&gt; option that instructs the client to mark downloaded messages as read (seen).&lt;/p&gt;
&lt;h2 id="improved-ftp-compatibility"&gt;Improved FTP compatibility&lt;/h2&gt;
&lt;p&gt;This release adds a set of workarounds for FTP servers that are unable to respond properly to &amp;quot;MLST /&amp;quot; command.&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.9048"&gt;release history&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Rebex Buru SFTP Server 2.14.4: Terrapin update, silent installation mode, Web Admin improvements.</title>
			<link>https://blog.rebex.net/buru-sftp-release-2-14-4</link>
			<description>A new release of Rebex Buru SFTP Server with Terrapin update, silent installation and more...</description>
			<author>Lukas Paluzga</author>
			<guid>https://blog.rebex.net/buru-sftp-release-2-14-4</guid>
			<pubDate>Wed, 31 Jul 2024 00:00:00 GMT</pubDate>
			<content:encoded>&lt;?# DownloadBox 
    title="Download Buru SFTP Server 2.14.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.14.4. Here is an overview of changes, fixes and improvements.&lt;/p&gt;
&lt;h2 id="terrapin-attack-mitigation"&gt;Terrapin attack mitigation&lt;/h2&gt;
&lt;p&gt;Buru SFTP Server now supports strict key exchange extension to mitigate the so-called '&lt;a href="https://terrapin-attack.com/"&gt;Terrapin attack&lt;/a&gt;' - &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2023-48795"&gt;CVE-2023-48795&lt;/a&gt;.
Although this is not a critical fix, since neither version of Buru SFTP Server relies on RFC 8308 extension negotiation mechanism, the update thwarts possible authentication disruption caused by an attacker using the Terrapin vulnerability.&lt;/p&gt;
&lt;h2 id="silent-installation-mode"&gt;Silent installation mode&lt;/h2&gt;
&lt;p&gt;Buru SFTP Server installer now supports &lt;a href="https://www.rebex.net/doc/buru-sftp-server/getting-started/01-installer#installation-silent"&gt;silent installation mode&lt;/a&gt;.
This mode allows you to install the server without any user interaction.
Several command-line options are available to customize the installation process, such as installation path, SSH port and more.&lt;/p&gt;
&lt;h2 id="web-admin-frontend-overhaul"&gt;Web Admin frontend overhaul&lt;/h2&gt;
&lt;p&gt;The Web Admin frontend has been updated with a new look that should feel less cluttered. It also provides a better user experience by adding several sought-after features:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Multiple users can now be selected for certain actions (lock, unlock, delete).&lt;/li&gt;
&lt;li&gt;Warnings shown when multiple SSH keys of the same type are added.&lt;/li&gt;
&lt;li&gt;Server public keys can now be easily exported from the web interface.&lt;/li&gt;
&lt;li&gt;Certificate details are now shown for keys with certificates.&lt;/li&gt;
&lt;li&gt;SSH algorithm selection is now simplified.&lt;/li&gt;
&lt;li&gt;and more...&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="minor-fixes-and-improvements"&gt;Minor fixes and improvements&lt;/h2&gt;
&lt;ul&gt;
  &lt;li&gt;2.11.2&lt;/li&gt;
  &lt;ul&gt;
      &lt;li&gt;Added support for strict key exchange extension.&lt;/li&gt;
      &lt;li&gt;Fixed 'not authenticated' instead of 'not connected' error message.&lt;/li&gt;
      &lt;li&gt;Allowed dates outside 1970-2999 range in SFTP v4 (or higher).&lt;/li&gt;
  &lt;/ul&gt;
  &lt;li&gt;2.11.3&lt;/li&gt;
  &lt;ul&gt;
      &lt;li&gt;Fixed configuration backup when upgrading using installer.&lt;/li&gt;
      &lt;li&gt;Updated signing certificate.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;li&gt;2.11.4&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Fixed &lt;a href="https://www.rebex.net/doc/buru-sftp-server/management/burusftp/user-update/"&gt;&lt;code&gt;user update&lt;/code&gt;&lt;/a&gt; command:
      &lt;ul&gt;
        &lt;li&gt;Fixed error message when Windows account is not found.&lt;/li&gt;
        &lt;li&gt;Fixed error when updating fields other than Windows account and related, when Windows account is already set, using Free license.&lt;/li&gt;
      &lt;/ul&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
  
  &lt;li&gt;2.12.0&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Added silent installation mode.&lt;/li&gt;
  &lt;/ul&gt;
  
  &lt;li&gt;2.12.1&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Fixed &lt;i&gt;CreateProcess failed&lt;/i&gt; error during installation.&lt;/li&gt;
  &lt;/ul&gt;
  
  &lt;li&gt;2.13.0&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Removed KeyCertSign and CrlSign usages from &lt;code&gt;burusftpwa certgen&lt;/code&gt;-generated certificates.&lt;/li&gt;
    &lt;li&gt;SSH banner is now configurable.&lt;/li&gt;
  &lt;/ul&gt;
  
  &lt;li&gt;2.14.0&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Web Admin - major changes:&lt;/li&gt;
  
    &lt;ul&gt;
      &lt;li&gt;Form visuals have been updated.&lt;/li&gt;
      &lt;li&gt;Multiple users can now be selected for certain actions (lock, unlock, delete).&lt;/li&gt;
      &lt;li&gt;UI customization changes:&lt;/li&gt;
      &lt;ul&gt;
        &lt;li&gt;Full Material UI schema is no longer supported.&lt;/li&gt;
        &lt;li&gt;Secondary palette is no longer supported.&lt;/li&gt;
      &lt;/ul&gt;
      &lt;li&gt;Error shown when multiple server SSH keys of same type are added.&lt;/li&gt;
      &lt;li&gt;Public server keys can now be easily exported from the web interface.&lt;/li&gt;
      &lt;li&gt;SSH algorithm selection is now simplified. Manual sorting is still supported by editing the configuration file.&lt;/li&gt;
      &lt;li&gt;User public keys are now displayed with SSH key type prefix.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/ul&gt;
  &lt;li&gt;2.14.1&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Added support for loading private keys in new OpenSSH key format encrypted using AES/GCM or ChaCha20/Poly1305.&lt;/li&gt;
    &lt;li&gt;Fixed handling of client's SSH_MSG_EXT_INFO message.&lt;/li&gt;
    &lt;li&gt;Added logging of SSH ciphers supported by the client on mismatch (log level: debug).&lt;/li&gt;
    &lt;li&gt;Environment variables can be used in server key paths.&lt;/li&gt;
    &lt;li&gt;Web Admin - fixed missing log level dropdown on logging configuration page.&lt;/li&gt;
    &lt;li&gt;Web Admin - server configuration page now shows full path to configuration file and revert buttons.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;li&gt;2.14.2&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Web Admin - fixed loading comment from user public keys.&lt;/li&gt;
    &lt;li&gt;Web Admin - server key list now also shows certificate details for keys with certificates.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;li&gt;2.14.3&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Added logging of user lockout events.&lt;/li&gt;
    &lt;li&gt;Fixed &lt;code&gt;burusftp user update &amp;lt;username&amp;gt; --password ""&lt;/code&gt; behavior - now removes password instead of setting an empty password.&lt;/li&gt;
    &lt;li&gt;Fixed &lt;code&gt;burusftp user add &amp;lt;username&amp;gt; --password ""&lt;/code&gt; behavior - now does nothing instead of setting an empty password.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;li&gt;2.14.4&lt;/li&gt;
  &lt;ul&gt;
    &lt;li&gt;Web Admin - fixed error when multiple IP address ranges were used in IP filtering textboxes.&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/buru-sftp-server/doc/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>
		<item>
			<title>Rebex .NET components 7.0.8943: MS Graph API support, improvements and fixes</title>
			<link>https://blog.rebex.net/version-7-0-8943</link>
			<description>This release introduces new MS Graph API library, brings improvements and fixes</description>
			<author>Lukas Pokorny</author>
			<guid>https://blog.rebex.net/version-7-0-8943</guid>
			<pubDate>Mon, 08 Jul 2024 00:00:00 GMT</pubDate>
			<content:encoded>&lt;h2 id="new-library-ms-graph-api-client"&gt;New library: MS Graph API client&lt;/h2&gt;
&lt;p&gt;Rebex Graph is a .NET library for accessing Microsoft 365 (Exchange Online) using Microsoft Graph API.
It can send, receive, list and search e-mail messages. Supports TLS 1.3/1.2 and S/MIME on a wide range of platforms
including .NET Framework 3.5, 4.0-4.8, and .NET 5-8.&lt;/p&gt;
&lt;p&gt;The new library is part of &lt;a href="https://www.rebex.net/total-pack/"&gt;Rebex Total Pack&lt;/a&gt; and &lt;a href="https://www.rebex.net/mail-pack/"&gt;Rebex Mail Pack&lt;/a&gt;.
It's also available separately as &lt;a href="https://www.rebex.net/graph/"&gt;Rebex Graph&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="aesgcm-encryption-for-openssh-keys"&gt;AES/GCM encryption for OpenSSH keys&lt;/h2&gt;
&lt;p&gt;Previously, Rebex libraries have been using the legacy AES/CBC encryption when saving private keys in new OpenSSH format.
This is considered weak, and was upgraded to AES/GCM in this release.&lt;/p&gt;
&lt;h2 id="improved-mime-to-msg-conversion"&gt;Improved MIME-to-MSG conversion&lt;/h2&gt;
&lt;p&gt;When converting between .eml (MIME) and .msg (Outlook mail format) files, Sensitivity header is supported as well.&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.8943"&gt;release history&lt;/a&gt;.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Office 365 and Rebex Graph with OAuth 2.0 authentication in unattended (app-only) mode: How to make it work</title>
			<link>https://blog.rebex.net/office365-graph-oauth-unattended</link>
			<description>App-only authentication is used for services/daemons with no singed-in user present. This step-by-step guide shows how to make it work.</description>
			<author>Alexandr Pleskot</author>
			<guid>https://blog.rebex.net/office365-graph-oauth-unattended</guid>
			<pubDate>Wed, 26 Jun 2024 00:00:00 GMT</pubDate>
			<content:encoded>&lt;p&gt;Microsoft 365 (formerly Office 365) supports two kinds of OAuth 2.0 authentication:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Delegated&lt;/em&gt; authentication is suitable for desktop, mobile or web applications with signed-in user present.&lt;br /&gt;
This mode is described in detail in &lt;a href="/office365-graph-oauth-delegated"&gt;another article&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;App-only&lt;/em&gt; authentication is suitable for &lt;strong&gt;services or daemons with no user present&lt;/strong&gt;.
Instead, these unattended applications authenticate using &lt;em&gt;client secrets&lt;/em&gt; (application credentials) to receive an &lt;em&gt;access token&lt;/em&gt;,
which is then used to gain access to a mailbox using Rebex Graph library.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Before your application can start accessing mailboxes, you have to register it with Microsoft, assign the relevant permissions and configure mailbox access.
The guide below describes what needs to be done to enable Graph access for &lt;strong&gt;unattended apps&lt;/strong&gt; (&lt;em&gt;app-only&lt;/em&gt; mode).
For other protocols, see &lt;a href="/office365-ews-oauth-unattended"&gt;EWS article&lt;/a&gt; or &lt;a href="/office365-imap-pop3-oauth-unattended"&gt;IMAP and POP3 article&lt;/a&gt;.&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;Configuring Microsoft 365
&lt;ul&gt;
&lt;li&gt;&lt;a href="#register-company"&gt;Register yourself and your company&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#register-application"&gt;Register your application&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#application-password"&gt;Set up client secret (application password)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#app-permissions"&gt;Add app permissions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="#code"&gt;C# sample code&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#rebex-dotnet-library"&gt;Documentation for Rebex Graph .NET library&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#common-issues"&gt;Common issues&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;h2 id="register-company"&gt;Register yourself and your company&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Log into &lt;a href="https://portal.azure.com/"&gt;Azure Portal&lt;/a&gt;. If you don't have an account there yet, &lt;a href="https://azure.microsoft.com/free/"&gt;create it&lt;/a&gt;.
You also have to &lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/quickstart-create-new-tenant"&gt;set up a tenant&lt;/a&gt; that represents your company.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you administer more than one tenant, use &lt;code&gt;Directories + subscriptions&lt;/code&gt; filter to select the tenant for whom to register an application.&lt;/p&gt;
&lt;img class="mx-auto d-block border" alt="Create new app registration" src="/images/2022/azure-00-subscriptions.png" /&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="register-application"&gt;Register your application&lt;/h2&gt;
&lt;ol start="3"&gt;
&lt;li&gt;&lt;p&gt;In &lt;a href="https://portal.azure.com/"&gt;Azure Portal&lt;/a&gt; ⇒ expand the left menu ⇒ select &lt;code&gt;Microsoft Entra ID&lt;/code&gt; ⇒ select &lt;code&gt;App registrations&lt;/code&gt; ⇒ click &lt;code&gt;+ New registration&lt;/code&gt;.
(Azure Portal is constantly evolving, so if you cannot find this page, use the search bar.)&lt;/p&gt;
&lt;img class="mx-auto d-block border" alt="Creating app registration 1" src="/images/2024/azure-1-new-registration.png" /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Name your application, choose which kind of accounts are going to use it, and click &lt;code&gt;Register&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: This guide is suitable for&lt;/em&gt; single tenant &lt;em&gt;account types. For other types, further steps might be different.&lt;/em&gt;&lt;/p&gt;
&lt;img class="mx-auto d-block border" alt="Creating app registration 2" src="/images/2024/azure-2-naming.png" /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You successfully registered your application and you can view its associated IDs. Some of them will be needed later to obtain an OAuth 2.0 token.&lt;/p&gt;
&lt;img class="mx-auto d-block border" alt="Creating app registration 3" src="/images/2024/azure-3-ids.png" /&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="application-password"&gt;Set up client secret (application password)&lt;/h2&gt;
&lt;ol start="6"&gt;
&lt;li&gt;&lt;p&gt;In the left menu, select &lt;code&gt;Certificates &amp;amp; secrets&lt;/code&gt; ⇒ click &lt;code&gt;+ New client secret&lt;/code&gt;.&lt;/p&gt;
&lt;img class="mx-auto d-block border" alt="Adding client secret 1" src="/images/2024/azure-4-create-secret.png" /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide some description for this secret, choose expiration period, and click &lt;code&gt;Add&lt;/code&gt;.&lt;/p&gt;
&lt;img class="mx-auto d-block border" alt="Adding client secret 2" src="/images/2024/azure-5-creating-new-secret.png" /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Immediately&lt;/strong&gt; copy and save the newly created client secret's &lt;code&gt;Value&lt;/code&gt; (not &lt;code&gt;Secret ID&lt;/code&gt;). You will not be able to view the &lt;code&gt;Value&lt;/code&gt; later anymore.&lt;/p&gt;
&lt;img class="mx-auto d-block border" alt="Adding client secret 3" src="/images/2024/azure-6-copy-secret.png" /&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="app-permissions"&gt;Add app permissions&lt;/h2&gt;
&lt;ol start="9"&gt;
&lt;li&gt;&lt;p&gt;In the left menu, select &lt;code&gt;API permissions&lt;/code&gt; ⇒ click &lt;code&gt;+ Add a permission&lt;/code&gt;.&lt;/p&gt;
&lt;img class="mx-auto d-block border" alt="Adding app permissions 1" src="/images/2024/azure-7-perms.png" /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Navigate to &lt;code&gt;Microsoft Graph&lt;/code&gt;.&lt;/p&gt;
&lt;img class="mx-auto d-block border" alt="Adding app permissions 2" src="/images/2024/azure-8-perms-opened.png" /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;code&gt;Application permissions&lt;/code&gt; ⇒ type &lt;code&gt;Mail&lt;/code&gt; ⇒ check &lt;code&gt;Mail.Read&lt;/code&gt; ⇒ click &lt;code&gt;Add permissions&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: Consider adding &lt;code&gt;Mail.ReadWrite&lt;/code&gt; and &lt;code&gt;Mail.Send&lt;/code&gt; as well, but these are not needed for this demo.&lt;/em&gt;&lt;/p&gt;
&lt;img class="mx-auto d-block border" alt="Adding app permissions 2" src="/images/2024/azure-9-selecting-perms.png" /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The newly-added &lt;code&gt;Mail.Read&lt;/code&gt; permission has to be approved by your organization's administrator.
Ask them to grant consent to your application by clicking &lt;code&gt;Grant admin consent for [organization]&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: This grants read access to &lt;strong&gt;all&lt;/strong&gt; Microsoft 365 Online mailboxes in your organization.
To restrict this, read &lt;a href="office365-ews-restrict-mailbox-access"&gt;How to restrict mailbox access of Azure applications in app-only mode&lt;/a&gt; article.&lt;/em&gt;&lt;/p&gt;
&lt;img class="mx-auto d-block border" alt="Adding app permissions 4" src="/images/2024/azure-10-gran-perms.png" /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Application permissions have been granted. Optionally, you can remove the &lt;em&gt;delegated&lt;/em&gt; &lt;code&gt;User.Read&lt;/code&gt; permission which is not needed
for app-only application - click the context menu on the right side of the permission and select &lt;code&gt;Remove permission&lt;/code&gt;.&lt;/p&gt;
&lt;img class="mx-auto d-block border" alt="Adding app permissions 5" src="/images/2024/azure-12-opt-remove.png" /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Congratulations! Now you have registered an application for accessing Office 365 mailboxes via Microsoft Graph API
and received its &lt;code&gt;Application (client) ID&lt;/code&gt;, &lt;code&gt;Client secret&lt;/code&gt; and &lt;code&gt;Directory (tenant) ID&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;These strings are going to be used by your application to authenticate to Microsoft 365 via OAuth 2.0 and receive an OAuth token.
This token is then used to authenticate to Exchange Online using Rebex Graph.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="code"&gt;Let's write some code!&lt;/h2&gt;
&lt;ol start="15"&gt;
&lt;li&gt;&lt;p&gt;In your application, add reference to &lt;a href="https://www.nuget.org/packages/Microsoft.Identity.Client/"&gt;Microsoft.Identity.Client&lt;/a&gt;
package, and specify your IDs, the secret, and the e-mail address. Specify the scope to request a token
as well (use &lt;code&gt;https://graph.microsoft.com/.default&lt;/code&gt; in app-only mode).&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// application (client) ID obtained from Azure
const string ClientId = &amp;quot;cf2207a9-1111-1111-1111-5867ad1cf91e&amp;quot;; // change to your AppId

// application's 'client secret' value (application password)
const string ClientSecretValue = &amp;quot;ThisIsSomeVerySecretValue&amp;quot;; // change to your secret value

// your organization's directory (tenant) ID
const string TenantId = &amp;quot;fb561382-2222-2222-2222-06ab992d36b7&amp;quot;; // change to your TenantId

// mailbox to access (not an alias)
const string MailAddress = &amp;quot;someone&amp;#64;example.org&amp;quot;; // change this

// default scope of permissions to request
private static readonly string[] Scopes = new[] {
    &amp;quot;https://graph.microsoft.com/.default&amp;quot;, // for accessing Exchange Online with app-only auth
};
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Before your application connects to Office 365's Graph service, it has to request an OAuth 2.0 &lt;em&gt;access token&lt;/em&gt; using
the Microsoft's authentication API.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;using Microsoft.Identity.Client;

...

// get an instance of 'CCA' API
var cca = ConfidentialClientApplicationBuilder
    .Create(ClientId)
    .WithClientSecret(ClientSecretValue)
    .WithTenantId(TenantId)
    .Build();

// acquire OAuth 2.0 access token from Microsoft 365
AuthenticationResult result = await cca.AcquireTokenForClient(Scopes).ExecuteAsync();
string accessToken = result.AccessToken;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then, connect to &lt;code&gt;graph.microsoft.com&lt;/code&gt;
using &lt;a href="https://www.nuget.org/packages/Rebex.Graph"&gt;Rebex Graph&lt;/a&gt; package
and use the acquired token to start accessing your organization's mailboxes.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;using Rebex.Net;

...

// connect to Office 365 
var client = new GraphClient();
client.Connect();

// specify mailbox to access
client.Settings.Impersonation = new GraphImpersonation(MailAddress);

// authenticate using the access token
client.Login(accessToken);

// start working with the mailbox
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To give this a try before adding the code to your application,
try our &lt;a href="https://github.com/rebexnet/RebexExtras/tree/master/Office365_OAuth2_IdentityClient/GraphOAuthAppOnlyConsole_IdentityClient"&gt;GraphOAuthAppOnlyConsole&lt;/a&gt;
sample.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="rebex-dotnet-library"&gt;Documentation for Rebex Graph .NET library&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rebex.net/graph"&gt;Rebex Graph homepage&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rebex.net/graph/download.aspx"&gt;Rebex Graph download&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rebex.net/graph/features/messages.aspx"&gt;Message operations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rebex.net/graph/features/folders.aspx"&gt;Folder operations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rebex.net/graph/features/search.aspx"&gt;Searching&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="common-issues"&gt;Any issues?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Use an &lt;a href="https://www.rebex.net/graph/history.aspx"&gt;up-to-date version&lt;/a&gt; of Rebex Graph. Old versions have not been tested with
contemporary Exchange Online. They might still work, but if you encounter any issues, please try the latest release.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This guide is only suitable for Rebex Graph.
For Exchange Web Services guide, see &lt;a href="/office365-ews-oauth-unattended"&gt;Office 365 and EWS with OAuth 2.0&lt;/a&gt;.
For IMAP/POP3 guide, see &lt;a href="/office365-imap-pop3-oauth-unattended"&gt;Office 365 and IMAP or POP3 with OAuth 2.0&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Need help? Ask at &lt;a href="https://forum.rebex.net/"&gt;Rebex Q&amp;amp;A Forum&lt;/a&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded>
		</item>
		<item>
			<title>How to use OAuth 2.0 authentication for Office 365 with Rebex Graph in delegated mode (with a signed-in user)</title>
			<link>https://blog.rebex.net/office365-graph-oauth-delegated</link>
			<description>This article provides step-by-step guide to making it all work.</description>
			<author>Alexandr Pleskot</author>
			<guid>https://blog.rebex.net/office365-graph-oauth-delegated</guid>
			<pubDate>Tue, 25 Jun 2024 00:00:00 GMT</pubDate>
			<content:encoded>&lt;p&gt;&lt;a href="https://oauth.net/2/"&gt;OAuth 2.0 authentication&lt;/a&gt; is quickly becoming a must-have feature for applications accessing cloud-based
email services such as Microsoft 365 (formerly Office 365) Exchange Online (formerly Outlook Online).
And although setting it up is relatively simple, there are many steps where things can easily go wrong.&lt;/p&gt;
&lt;p&gt;In this article, we will show how to implement a .NET desktop WPF application that uses Rebex Graph
component to access a Microsoft 365 mailbox via Microsoft Graph API.
Apart from Rebex Graph and a JSON parser the application does not rely on third-party libraries.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;If your application is a service/daemon with no user present,
see &lt;a href="/office365-graph-oauth-unattended"&gt;Rebex Graph with OAuth 2.0 in unattended (app-only) mode&lt;/a&gt; instead.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;You can get our &lt;a href="https://github.com/rebexnet/RebexExtras/tree/master/Office365_OAuth2"&gt;sample source code&lt;/a&gt; from &lt;a href="https://github.com/rebexnet/RebexExtras"&gt;Rebex Extras&lt;/a&gt; repository on GitHub straight away,
and use the rest of the article as a guide to how it works.&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="quick-overview"&gt;Quick overview&lt;/h2&gt;
&lt;p&gt;The &lt;a href="https://github.com/rebexnet/RebexExtras/tree/master/Office365_OAuth2/GraphOAuthWpfApp"&gt;sample application&lt;/a&gt; implements
the whole &lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow"&gt;OAuth 2.0 authorization code flow&lt;/a&gt;
and don't rely on an external library for this. Another option is to use &lt;a href="https://www.nuget.org/packages/Microsoft.Identity.Client/"&gt;Microsoft.Identity.Client&lt;/a&gt;
package - in that case, you might prefer &lt;a href="https://github.com/rebexnet/RebexExtras/tree/master/Office365_OAuth2_IdentityClient"&gt;another set of sample apps&lt;/a&gt; that use that
API instead.&lt;/p&gt;
&lt;p&gt;But even if you end up using Microsoft's API, this article is still useful,
because the prerequisites and the final steps are the same, and it's useful to
understand what's actually going on under the hood. The underlying logic is
the same, Microsoft.Identity.Client just adds more abstraction layers and performs
actions described in steps 5, 6 and 9 under the hood.&lt;/p&gt;
&lt;p&gt;Before you actually run the application, make sure you have all the prerequisites:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="registering-app-for-oauth2-office365"&gt;Register your application in Azure&lt;/a&gt; and grant it appropriate permissions.&lt;/li&gt;
&lt;li&gt;Choose a suitable &amp;quot;tenant&amp;quot;.&lt;/li&gt;
&lt;li&gt;Determine scope of permissions you need.&lt;/li&gt;
&lt;li&gt;Consider additional options.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Then, in the actual application, you would do this:&lt;/p&gt;
&lt;ol start="5"&gt;
&lt;li&gt;Direct the user to an authentication URL (via embedded browser).&lt;/li&gt;
&lt;li&gt;Retrieve the authentication code and redeem it for an access token.&lt;/li&gt;
&lt;li&gt;Access the mailbox using Graph.&lt;/li&gt;
&lt;li&gt;Refresh the access token (if needed).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This applies to desktop Windows applications using &lt;em&gt;delegated&lt;/em&gt; authentication.
That simply means applications with a single signed-in user present. Most mobile
applications would use the same approach as well.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Note: For applications with no signed-in user present (such as services or
daemons), the process is a bit different, and the application needs to be
configured for&lt;/em&gt; unattended &lt;em&gt;(app-only) authentication. This is outside the scope
of this article - see &lt;a href="/office365-graph-oauth-unattended"&gt;Rebex Graph with OAuth 2.0 in app-only mode&lt;/a&gt;
instead.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Now, let's get started:&lt;/p&gt;
&lt;h2 id="register-your-application-with-microsoft"&gt;1. Register your application with Microsoft&lt;/h2&gt;
&lt;p&gt;Before you can use OAuth 2.0 authentication for accessing Office 365
mailbox via Microsoft Graph API, you have to
&lt;a href="registering-app-for-oauth2-office365"&gt;register your application with Azure Active Directory&lt;/a&gt;
and configure it properly.&lt;/p&gt;
&lt;p&gt;During the process, you will obtain your application's &lt;em&gt;Client ID&lt;/em&gt;, which is a GUID
that uniquely identifies your application. You will also specify a &lt;em&gt;tenant&lt;/em&gt; and &lt;em&gt;scope
of permissions&lt;/em&gt; (more on these below).&lt;/p&gt;
&lt;h2 id="specify-a-suitable-tenant"&gt;2. Specify a suitable &amp;quot;tenant&amp;quot;&lt;/h2&gt;
&lt;p&gt;You also have to specify what kinds of Microsoft users are going to use
your application. This means choosing a suitable &lt;em&gt;Tenant ID&lt;/em&gt; value that corresponds
to your application registration (&amp;quot;Supported account types&amp;quot; in the app registration form).
It will usually be &lt;code&gt;common&lt;/code&gt; (users with personal Microsoft accounts or work/school accounts),
&lt;code&gt;organizations&lt;/code&gt; (only users with work/school accounts), or &lt;code&gt;consumers&lt;/code&gt; (only users
with personal accounts).&lt;/p&gt;
&lt;p&gt;Alternatively, if you only wish to allow users from your organization, it could be a domain
name or a GUID (see the &lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/active-directory-v2-protocols#endpoints"&gt;endpoints documentation&lt;/a&gt;)
for details.&lt;/p&gt;
&lt;p&gt;In our sample applications, we used &lt;code&gt;organizations&lt;/code&gt;, but you can &lt;a href="https://github.com/rebexnet/RebexExtras/blob/master/Office365_OAuth2/GraphOAuthWpfApp/MainWindow.xaml.cs#L27"&gt;modify that&lt;/a&gt; easily.&lt;/p&gt;
&lt;h2 id="determine-scope-of-permissions"&gt;3. Determine scope of permissions&lt;/h2&gt;
&lt;p&gt;Before you can direct a user to Microsoft's server to authorize your app, you also have
to determine which kinds of &lt;em&gt;scopes&lt;/em&gt; (permissions) to actually ask for.&lt;/p&gt;
&lt;p&gt;Microsoft identity platform's &lt;em&gt;scopes&lt;/em&gt; are &lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-permissions-and-consent"&gt;not exactly trivial&lt;/a&gt;,
but for the purpose of mailbox access, only few of them are needed.&lt;/p&gt;
&lt;p&gt;Scopes for OAuth 2.0 access token:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;profile&amp;quot;&lt;/code&gt; - This one is needed to retrieve the user name. It's not needed for this sample.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;email&amp;quot;&lt;/code&gt; - This is not required, but might be useful.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;openid&amp;quot;&lt;/code&gt; - If you request &lt;code&gt;profile&lt;/code&gt; or &lt;code&gt;email&lt;/code&gt;, you'll have to include this as well to retrieve the JSON Web Token that contains that information.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;offline_access&amp;quot;&lt;/code&gt; - This permission makes it possible for the application to keep accessing the mailbox even when the original &lt;em&gt;access token&lt;/em&gt; expires after an hour. With &lt;code&gt;offline_access&lt;/code&gt;, the application receives a &lt;em&gt;refresh token&lt;/em&gt; which can be used to obtain a new &lt;em&gt;access token&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Scopes for Microsoft Graph API:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;https://graph.microsoft.com/User.Read&amp;quot;&lt;/code&gt; - Required for reading user's profile info.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;https://graph.microsoft.com/Mail.Read&amp;quot;&lt;/code&gt; - Required for reading mails.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;https://graph.microsoft.com/Mail.Send&amp;quot;&lt;/code&gt; - Required for sending mails.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;https://graph.microsoft.com/Mail.ReadWrite&amp;quot;&lt;/code&gt; - Required for manipulating mails.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;If you want to keep configuration simple, you can just use single &lt;a href="https://learn.microsoft.com/en-us/entra/identity-platform/scopes-oidc#the-default-scope"&gt;.default scope&lt;/a&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;https://graph.microsoft.com/.default&amp;quot;&lt;/code&gt; - Requests all permissions defined in app registration (cannot be combined with other &lt;code&gt;&amp;quot;https://graph.microsoft.com/&amp;quot;&lt;/code&gt; scopes).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Make sure that you actually granted the required permissions to your application in Azure Portal.&lt;/p&gt;
&lt;h2 id="consider-additional-options"&gt;4. Consider additional options&lt;/h2&gt;
&lt;p&gt;You might also wish specify &lt;em&gt;prompt type&lt;/em&gt;, which determines the type of required user interaction.
The following values are available:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; - This is the default mode. The authentication server will not request the credentials if the user has already signed in.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;login&amp;quot;&lt;/code&gt; - The authentication server will always request user's credentials.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;none&amp;quot;&lt;/code&gt; - The server will never ask the user for credentials, which means this will only work once the user has already signed in.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;consent&amp;quot;&lt;/code&gt; - This will explicitly ask the user to grant requested permissions to the app (even if he already did before).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;quot;select_account&amp;quot;&lt;/code&gt; - This will present the user with account selection dialog, which can be useful for users with multiple Microsoft accounts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For detailed information about prompt types, see the &lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow#request-an-authorization-code"&gt;documentation&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Another option that varies from app to app is &lt;em&gt;redirect URI&lt;/em&gt;. This indicates
where the authentication server should redirect the user once successfully
authenticated (or failed). However, for the purpose of desktop or
mobile application with an embedded browser, we can simply
use a &lt;a href="https://login.microsoftonline.com/common/oauth2/nativeclient"&gt;special URL&lt;/a&gt;
that exists specifically for this purpose.&lt;/p&gt;
&lt;p&gt;In our sample app, this special URL is used by default.&lt;/p&gt;
&lt;h2 id="direct-the-user-to-an-authentication-url"&gt;5. Direct the user to an authentication URL&lt;/h2&gt;
&lt;p&gt;Once the application has all of the information above
(put them &lt;a href="https://github.com/rebexnet/RebexExtras/blob/master/Office365_OAuth2/GraphOAuthWpfApp/MainWindow.xaml.cs#L29"&gt;here&lt;/a&gt;),
it's ready to ask the user to grant the required permissions to access their
Office 365 mailbox. It does so by opening a window with an embedded browser for the user,
and points it to an URL at Microsoft's authentication server.&lt;/p&gt;
&lt;p&gt;In our sample app, we implemented a &lt;code&gt;OAuthAzureAuthorizationWindow&lt;/code&gt; class for this
purpose, and initiating the process is very simple:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// create a Window that handles OAuth2 authorization
var authenticationWindow = new OAuthAzureAuthorizationWindow();
authenticationWindow.Owner = this;

// specify the kind of authorization we need
authenticationWindow.ClientId = ClientId; // application's client ID
authenticationWindow.TenantId = &amp;quot;organizations&amp;quot;; // kinds of users to allow
authenticationWindow.PromptType = &amp;quot;&amp;quot;; // prompt type to use
authenticationWindow.Scopes = Scopes; // scope of permissions to request

// perform the authorization and obtain the credentials
var credentials = await authenticationWindow.AuthorizeAsync(); 
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;a href="https://github.com/rebexnet/RebexExtras/blob/master/Office365_OAuth2/OAuthAzureHelper/OAuthAzureAuthorizationWindow.xaml.cs"&gt;source code&lt;/a&gt; for &lt;code&gt;OAuthAzureAuthorizationWindow&lt;/code&gt; class comes with the sample app
as well, and can be easily customized. This is what the &lt;code&gt;AuthorizeAsync&lt;/code&gt;
method actually does:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// get redirect URI and determine expected authority
string redirectUri = RedirectUri ?? OAuthAzureCredentials.DefaultRedirectUri;

// create an instance of OAuthAzureCredentials helper class
_credentials = new OAuthAzureCredentials(ClientId, TenantId, PromptType, redirectUri, Scopes);

// create task completion source for the whole action
_taskCompletion = new TaskCompletionSource&amp;lt;OAuthAzureCredentials&amp;gt;();

// Direct the user to authorization endpoint.
// Once completed, the application will receive an authorization code.

// show the window and navigate to authentication URI
Show();
webBrowser.Navigate(_credentials.AuthorizationUri);

// return task that will finish on succcess or failure
return _taskCompletion.Task;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;OAuthAzureCredentials&lt;/code&gt; helper class (&lt;a href="https://github.com/rebexnet/RebexExtras/blob/master/Office365_OAuth2/OAuthAzureHelper/OAuthAzureCredentials.cs"&gt;source included&lt;/a&gt;) encapsulates the OAuth 2.0 authentication
logic, while &lt;code&gt;OAuthAzureAuthorizationWindow&lt;/code&gt; class adds WPF-specific bits - mostly
the embedded browser window provided by .NET's WPF &lt;a href="https://docs.microsoft.com/en-us/dotnet/api/system.windows.controls.webbrowser?view=net-5.0"&gt;WebBrowser class&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="retrieve-the-authentication-code-and-redeem-it-for-an-access-token"&gt;6. Retrieve the authentication code and redeem it for an access token&lt;/h2&gt;
&lt;p&gt;Once the user has authenticated to Microsoft's server and granted us permissions,
the browser window will be directed to an URL that contains an &lt;em&gt;authentication code&lt;/em&gt;.
This is essential, as this is what the application needs in order to obtain
an OAuth 2.0 access token for accessing Office 365 mailboxes.&lt;/p&gt;
&lt;p&gt;Our WPF authentication window class grabs the code from the redirected URL's query string
and calls &lt;code&gt;OAuthAzureCredentials&lt;/code&gt;'s &lt;code&gt;RequestAccessTokenAsync&lt;/code&gt; method to redeem it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// get query part of the browser URL
var query = System.Web.HttpUtility.ParseQueryString(e.Uri.Query);

...

// get authorization code from the supplied URL
string authorizationCode = query[&amp;quot;code&amp;quot;];
if (authorizationCode == null)
{
    // we are not on the final authentication page yet...
    return;
}

// The user has granted us permissions, and we received an authorization code.
// Next, we will exchange the code for an access token using the '/token' endpoint.

await _credentials.RequestAccessTokenAsync(authorizationCode);

// close the window and finish the successful asynchronous authentication request
Close();
_taskCompletion.SetResult(_credentials);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And this is what actually goes on inside the &lt;code&gt;RequestAccessTokenAsync&lt;/code&gt; method:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// construct the request body
string requestBody = string.Format(
    CultureInfo.InvariantCulture,
    &amp;quot;grant_type=authorization_code&amp;amp;code={0}&amp;amp;scope={1}&amp;amp;redirect_uri={2}&amp;amp;client_id={3}&amp;quot;,
    authorizationCode,
    _scopes,
    Uri.EscapeDataString(RedirectUri),
    _clientId);

// send it via POST request and receive response
string responseJson = await HttpPostAsync(_tokenEndPoint, requestBody);

// deserialize JSON response
var response = DeserializeJson(responseJson);

// get OAuth 2.0 access token
AccessToken = GetStringValue(response, &amp;quot;access_token&amp;quot;);
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here, we construct an HTTP POST request and send it to an endpoint at Microsoft's server
(the actual URL is &lt;code&gt;https://login.microsoftonline.com/{tenant}/oauth2/v2.0/token&lt;/code&gt;,
where &lt;code&gt;{tenant}&lt;/code&gt; is the &lt;em&gt;tenant ID&lt;/em&gt;, as explained above).&lt;/p&gt;
&lt;p&gt;The server will reply with a JSON response, which contains not only the OAuth 2.0 &lt;em&gt;access token&lt;/em&gt;,
but also additional information, such as user name, e-mail, or refresh token (based on the
scope of permissions requested).&lt;/p&gt;
&lt;p&gt;To parse the JSON response, we used Microsoft's &lt;a href="https://docs.microsoft.com/en-us/dotnet/standard/serialization/system-text-json-how-to?pivots=dotnet-5-0"&gt;new JSON API&lt;/a&gt;,
but you can easily use the popular &lt;a href="https://www.nuget.org/packages/Newtonsoft.Json/"&gt;Newtonsoft.Json&lt;/a&gt; package
as well - just add a reference to it, uncomment the &lt;a href="https://github.com/rebexnet/RebexExtras/blob/master/Office365_OAuth2/OAuthAzureHelper/OAuthAzureCredentials.cs#L363"&gt;relevant line of code&lt;/a&gt;
in &lt;code&gt;DeserializeJson&lt;/code&gt; method (and remove MS API code).&lt;/p&gt;
&lt;h2 id="access-the-mailbox-using-microsoft-graph-api"&gt;7. Access the mailbox using Microsoft Graph API&lt;/h2&gt;
&lt;p&gt;Now that the application finally has the &lt;em&gt;access token&lt;/em&gt;, it can access the user's mailbox at &lt;code&gt;graph.microsoft.com&lt;/code&gt;
via &lt;a href="https://www.rebex.net/graph/"&gt;Rebex Graph&lt;/a&gt; component.&lt;/p&gt;
&lt;p&gt;It's very straightforward:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// connect to the server
var client = new Rebex.Net.GraphClient();
await client.ConnectAsync();

// authenticate using the OAuth 2.0 access token
await client.LoginAsync(_credentials.AccessToken);

// do something
GraphFolderInfo folderInfo = await client.GetFolderInfoAsync(GraphFolderId.Inbox);

// or something else
GraphMessageCollection messageList = await client.GetMessageListAsync(GraphFolderId.Inbox, ...);
...
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="refreshing-the-access-token-if-needed"&gt;8. Refreshing the access token (if needed)&lt;/h2&gt;
&lt;p&gt;The &lt;em&gt;access token&lt;/em&gt; expires in one hour. If the application needs to keep accessing
the mailbox for longer periods of time without asking the user to authenticate again,
it also has to take care of &lt;em&gt;refreshing&lt;/em&gt; the access token. To be able to do this,
it must have been granted the &lt;code&gt;offline_access&lt;/code&gt; scope.&lt;/p&gt;
&lt;p&gt;To refresh the access token, application calls the &lt;code&gt;RefreshAccessTokenAsync&lt;/code&gt; method,
which again constructs a relevant HTTP POST request and posts it to an endpoint at
Microsoft's server. The server responds with a new access and refresh tokens:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// construct the request body
string requestBody = &amp;quot;grant_type=refresh_token&amp;amp;client_id=&amp;quot; + _clientId + &amp;quot;&amp;amp;refresh_token=&amp;quot; + RefreshToken;

// send it via POST request and receive response
string responseJson = await HttpPostAsync(_tokenEndPoint, requestBody);

// deserialize JSON response
var response = DeserializeJson(responseJson);

// update OAuth 2.0 access token and refresh token
AccessToken = GetStringValue(response, &amp;quot;access_token&amp;quot;);
RefreshToken = GetStringValue(response, &amp;quot;refresh_token&amp;quot;);
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id="what-next"&gt;What next?&lt;/h2&gt;
&lt;p&gt;We tried to make the sample code simple to read and reuse, and although we utilized
.NET 4.5's &lt;code&gt;await/async&lt;/code&gt; extensively, the code can be easily converted to
.NET Framework 3.5 or 4.0. Just make sure the embedded browser on the target platform
supports TLS 1.2, otherwise the user would not be able to authenticate. Actually,
we have &lt;a href="https://github.com/rebexnet/RebexExtras/tree/master/Office365_OAuth2_Legacy"&gt;already converted the code&lt;/a&gt; for you.&lt;/p&gt;
&lt;p&gt;You might also want to consider &lt;a href="https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow#request-an-authorization-code"&gt;more options&lt;/a&gt;
such as &lt;code&gt;domain_hint&lt;/code&gt;, &lt;code&gt;state&lt;/code&gt; or &lt;code&gt;code_challenge&lt;/code&gt;. These are not required for desktop
apps (yet), but it might be a good idea to already take advantage of them for the extra
security they offer.&lt;/p&gt;
&lt;p&gt;Another option to consider is to discard our simple OAuth 2.0 helper classes and
use &lt;a href="https://www.nuget.org/packages/Microsoft.Identity.Client/"&gt;Microsoft.Identity.Client&lt;/a&gt; API
instead. This is available for .NET 4.5 or later, and makes it possible to perform
the whole process without the need to delve into the internals. It's a powerful API, but
also somewhat complex, and seemingly simple actions might be hard to figure out.
But once you get it working, you get all the latest features with no extra effort.
If you prefer this option, we already have a &lt;a href="https://github.com/rebexnet/RebexExtras/tree/master/Office365_OAuth2_IdentityClient"&gt;ready-to-use sample apps&lt;/a&gt; as well.&lt;/p&gt;
</content:encoded>
		</item>
		<item>
			<title>Rebex not affected by xz vulnerability CVE-2024-3094</title>
			<link>https://blog.rebex.net/rebex-not-affected-by-xz-vulnerability</link>
			<description>Rebex and its products are not affected by xz vulnerability CVE-2024-3094.</description>
			<author>Lukas Paluzga</author>
			<guid>https://blog.rebex.net/rebex-not-affected-by-xz-vulnerability</guid>
			<pubDate>Tue, 02 Apr 2024 00:00:00 GMT</pubDate>
			<content:encoded>&lt;p&gt;Rebex and its products &lt;strong&gt;ARE NOT affected&lt;/strong&gt; by a recently discovered xz and subsequently OpenSSH &lt;a href="https://www.cve.org/CVERecord?id=CVE-2024-3094"&gt;critical vulnerability
CVE-2024-3094&lt;/a&gt;. The vulnerability creates a backdoor in SSH authentication and thus allows the attacker to gain unauthorized access to the system.&lt;/p&gt;
&lt;p&gt;To avoid any confusion: The list of Rebex products safe from this vulnerability includes
&lt;a href="https://www.rebex.net/buru-sftp-server/"&gt;Rebex Buru SFTP Server&lt;/a&gt;,
&lt;a href="https://www.rebex.net/total-pack/"&gt;Rebex Total Pack&lt;/a&gt; (and all .NET components included in it).&lt;/p&gt;
&lt;p&gt;Our free tools
&lt;a href="https://www.rebex.net/jumble/"&gt;Jumble obfuscator&lt;/a&gt;,
&lt;a href="https://www.rebex.net/tiny-sftp-server/"&gt;Rebex Tiny SFTP Server&lt;/a&gt;,
&lt;a href="https://www.rebex.net/tls-proxy/"&gt;Rebex TLS Proxy&lt;/a&gt; or
&lt;a href="https://www.rebex.net/mail-converter/"&gt;Rebex Mail Converter&lt;/a&gt;
are also &lt;strong&gt;not affected&lt;/strong&gt;.&lt;/p&gt;
</content:encoded>
		</item>
	</channel>
</rss>