On Wed Feb 4, 2026 at 5:13 PM CET, Arthur Bied-Charreton wrote:
> The OAuth2 flow redirects to the service's origin
> (window.location.origin) after successful authentication.
>
> The callback handler infers whether the login was triggered as the
> result of an OAuth2 redirect based on the presence of the code, scope,
> and state URL parameters. It then communicates the authentication
> results back to the parent window, which is responsible for closing it.
>
> Signed-off-by: Arthur Bied-Charreton <[email protected]>
> ---
>  www/manager6/Workspace.js | 20 ++++++++++++++++++++
>  1 file changed, 20 insertions(+)
>
> diff --git a/www/manager6/Workspace.js b/www/manager6/Workspace.js
> index b8061c2a..1e79dd57 100644
> --- a/www/manager6/Workspace.js
> +++ b/www/manager6/Workspace.js
> @@ -150,9 +150,29 @@ Ext.define('PVE.StdWorkspace', {
>          me.down('pveResourceTree').selectById(nodeid);
>      },
>  
> +    handleOauth2Callback: function (params) {
> +        const code = params.get('code');
> +        const scope = params.get('scope');
> +        const state = params.get('state');

Regarding the use of `const`, check out our JavaScript styleguide [1];
it says:

  Avoid using const for everything, but rather in the sense of
  constants. JavaScript is too dynamic for it to provide actual benefits
  if used as default.

[1] https://pve.proxmox.com/wiki/Javascript_Style_Guide#Variables
> +
> +        // If true, this window was opened by the OAuth2 button handler from 
> the
> +        // SMTP notification targets edit panel.
> +        //
> +        // Since we got here through a redirect, this window is not 
> script-closable,
> +        // and we rely on the parent window to close it in its broadcast 
> channel's
> +        // message handler.
> +        if (code && scope && state) {
> +            const { channelName } = JSON.parse(decodeURIComponent(state));
> +            const bc = new BroadcastChannel(channelName);
> +            bc.postMessage({ code, scope });
> +        }
> +    },
> +
>      onLogin: function (loginData) {
>          let me = this;
>  
> +        me.handleOauth2Callback(new URLSearchParams(window.location.search));
> +
>          me.updateUserInfo();
>  
>          if (loginData) {




Reply via email to