public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
* [PATCH docs/manager/proxmox{,-perl-rs,-widget-toolkit} v2 00/16] fix #7238: Add XOAUTH2 authentication support for SMTP notification targets
@ 2026-03-25 13:14 Arthur Bied-Charreton
  2026-03-25 13:14 ` [PATCH proxmox v2 01/16] notify: smtp: Introduce xoauth2 module Arthur Bied-Charreton
                   ` (15 more replies)
  0 siblings, 16 replies; 17+ messages in thread
From: Arthur Bied-Charreton @ 2026-03-25 13:14 UTC (permalink / raw)
  To: pve-devel

This series adds XOAUTH2 support for SMTP notification targets, motivated
by Microsoft's upcoming deprecation of basic authentication for SMTP [0].
Google and Microsoft are supported as OAuth2 providers.

OAuth2 refresh tokens may need to be rotated, therefore they are treated as
state, not config. They are persisted in separate JSON files and managed
entirely from the Rust side. Each endpoint has its own state file to avoid
having to lock the entire file system everytime a state update is made.

The oauth2 crate is used with a local ureq backend (newtype over ureq::Agent).
oauth2's ureq feature is currently patched out in Debian due to a ureq 2/3
version mismatch (oauth2 still depends on ureq 2.x, and Debian only packages
3.x).

Since tokens that are not used for extended periods of time may expire, token
refresh is triggered proactively via pveupdate, additionally to every time a
notification is sent, to prevent unused endpoints' tokens from expiring.

The UI part of the OAuth2 flow is made opt-in in order to allow adding it only
to PVE, and later to PBS in a follow-up series.

This series requires the following version requirement bumps:
* pve-manager requires bumped proxmox-widget-toolkit and proxmox-perl-rs
* proxmox-perl-rs requires bumped proxmox-notify

Note that this introduces a breaking change in the proxmox-notify bindings of
proxmox-perl-rs.

Known issues:
- Microsoft OAuth2 support is untested (no test tenant, somehow impossible to
  create a free test account). It is implemented by following the Microsoft
  Entra ID docs, but there might be something I overlooked. I would highly
  appreciate it if someone was able to test it with their account.

Changes since RFC:

proxmox-notify:
    * Simplify state handling logic simplified by special-casing SMTP endpoints
    instead of making it generic
    * Only pull oauth2 and ureq crates along with the smtp feature
    * Create state files in `/etc/pve/priv/notifications` subdirectory
    * Create one state file per endpoint (as opposed to one for all) to avoid
    races
    * Fix TOCTOU errors by using `proxmox_sys::fs::file_get_optional_contents` for
    IO
    * Add logging and state-related error types
    * Factor out SMTP transport building to its own function

pve-manager,proxmox-perl-rs:
    * Pass SMTP endpoints configs as hash instead of flat list of parameters

pve-manager:
    * Use `let` instead of `const` for JS variables
    * Rename endpoint for triggering endpoint state refresh from `refresh-targets`
    to `trigger-state-refresh`

pve-docs:
    * Add some more provider-related tips/warnings
    * Explain what is meant by "manual intervention"
    * Show how to add an XOAUTH2 SMTP endpoint via `pvesh`

Changes since v1:

proxmox-notify:
    * Fix scoping convention in commit messages
    * Pull in proxmox-sys and nix unconditionally
    * Change path to state files from `/etc/pve/priv/notifications/name.json` to
    `**/state-name.json`
    * Create `/etc/pve/priv/notifications` with own `ensure_dir_exists` helper
    * Remove unrelated change in lib.rs
    * Fix import grouping
    * Use `debug!` instead of `info!` for logs, except when an OAuth2 token was
    successfully refreshed
    * Declare `SMTP_STATE_REFRESH_CUTOFF_SECONDS` directly as a `Duration`
    * Delete state file when deleting endpoint

pve-cluster:
    * Remove unused function

pve-manager:
    * Mention that the new `trigger-state-refresh` endpoint will refresh OAuth2
    state in its description
    * Fix formatting issues
    * Clarify that `oauth2-tenant-id` is only required for Microsoft endpoints
    in its description in`smtp_properties`
    * Mention the API change in proxmox-perl-rs in commit message updating call
    sites

proxmox-widget-toolkit:
    * Fix formatting issues
    * Add visual user feedback after successful authorization
    * Allow editing OAuth2 SMTP endpoints without re-entering the client secret
    and going through the autorization flow again
    * Change `Authenticate` button to `Authorize`

pve-docs:
    * Change occurences of `Authenticate` to `Authorize`

[0] https://techcommunity.microsoft.com/blog/exchange/updated-exchange-online-smtp-auth-basic-authentication-deprecation-timeline/4489835
[1] https://git.proxmox.com/?p=debcargo-conf.git;a=blob;f=src/oauth2/debian/patches/disable-ureq.patch;h=828b883a83a86927c5cd32df055226a5e78e8bea;hb=refs/heads/proxmox/trixie


proxmox:

Arthur Bied-Charreton (6):
  notify: smtp: Introduce xoauth2 module
  notify: smtp: Introduce state management
  notify: smtp: Factor out transport building logic
  notify: smtp: Update API with OAuth2 parameters
  notify: smtp: Add state handling logic
  notify: smtp: Add XOAUTH2 authentication support

 proxmox-notify/Cargo.toml                    |  17 +-
 proxmox-notify/debian/control                |  58 ++--
 proxmox-notify/src/api/common.rs             |  16 ++
 proxmox-notify/src/api/smtp.rs               | 126 +++++++--
 proxmox-notify/src/context/mod.rs            |  14 +
 proxmox-notify/src/context/pbs.rs            |  14 +
 proxmox-notify/src/context/pve.rs            |  17 +-
 proxmox-notify/src/context/test.rs           |  14 +
 proxmox-notify/src/endpoints/smtp.rs         | 241 ++++++++++++++--
 proxmox-notify/src/endpoints/smtp/xoauth2.rs | 282 +++++++++++++++++++
 proxmox-notify/src/lib.rs                    |  33 ++-
 11 files changed, 746 insertions(+), 86 deletions(-)
 create mode 100644 proxmox-notify/src/endpoints/smtp/xoauth2.rs


proxmox-perl-rs:

Arthur Bied-Charreton (2):
  pve-rs: notify: smtp: add OAuth2 parameters to bindings
  pve-rs: notify: Add binding for triggering state refresh

 common/src/bindings/notify.rs | 78 ++++++++++++-----------------------
 1 file changed, 26 insertions(+), 52 deletions(-)


proxmox-widget-toolkit:

Arthur Bied-Charreton (2):
  utils: Add OAuth2 flow handlers
  notifications: Add opt-in OAuth2 support for SMTP targets

 src/Utils.js                   |  88 +++++++++++
 src/panel/SmtpEditPanel.js     | 268 +++++++++++++++++++++++++++++++--
 src/window/EndpointEditBase.js |   1 +
 3 files changed, 346 insertions(+), 11 deletions(-)


pve-manager:

Arthur Bied-Charreton (5):
  notifications: Add OAuth2 parameters to schema and add/update
    endpoints
  notifications: Add trigger-state-refresh endpoint
  notifications: Trigger notification target refresh in pveupdate
  notifications: Handle OAuth2 callback in login handler
  fix #7238: notifications: Opt into OAuth2 authentication

 PVE/API2/Cluster/Notifications.pm | 144 +++++++++++++++++++++++++-----
 bin/pveupdate                     |   9 ++
 www/manager6/Utils.js             |  10 +++
 www/manager6/Workspace.js         |  20 +++++
 4 files changed, 160 insertions(+), 23 deletions(-)


pve-docs:

Arthur Bied-Charreton (1):
  notifications: Add section about OAuth2 to SMTP targets docs

 notifications.adoc | 99 ++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 99 insertions(+)


Summary over all repositories:
  20 files changed, 1377 insertions(+), 172 deletions(-)

-- 
Generated by murpp 0.10.0



^ permalink raw reply	[flat|nested] 17+ messages in thread

end of thread, other threads:[~2026-03-25 13:23 UTC | newest]

Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-03-25 13:14 [PATCH docs/manager/proxmox{,-perl-rs,-widget-toolkit} v2 00/16] fix #7238: Add XOAUTH2 authentication support for SMTP notification targets Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH proxmox v2 01/16] notify: smtp: Introduce xoauth2 module Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH proxmox v2 02/16] notify: smtp: Introduce state management Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH proxmox v2 03/16] notify: smtp: Factor out transport building logic Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH proxmox v2 04/16] notify: smtp: Update API with OAuth2 parameters Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH proxmox v2 05/16] notify: smtp: Add state handling logic Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH proxmox v2 06/16] notify: smtp: Add XOAUTH2 authentication support Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH proxmox-perl-rs v2 07/16] pve-rs: notify: smtp: add OAuth2 parameters to bindings Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH proxmox-perl-rs v2 08/16] pve-rs: notify: Add binding for triggering state refresh Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH proxmox-widget-toolkit v2 09/16] utils: Add OAuth2 flow handlers Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH proxmox-widget-toolkit v2 10/16] notifications: Add opt-in OAuth2 support for SMTP targets Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH pve-manager v2 11/16] notifications: Add OAuth2 parameters to schema and add/update endpoints Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH pve-manager v2 12/16] notifications: Add trigger-state-refresh endpoint Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH pve-manager v2 13/16] notifications: Trigger notification target refresh in pveupdate Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH pve-manager v2 14/16] notifications: Handle OAuth2 callback in login handler Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH pve-manager v2 15/16] fix #7238: notifications: Opt into OAuth2 authentication Arthur Bied-Charreton
2026-03-25 13:14 ` [PATCH pve-docs v2 16/16] notifications: Add section about OAuth2 to SMTP targets docs Arthur Bied-Charreton

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal