diff --git a/src/backend/controllers/oidc/OIDCController.ts b/src/backend/controllers/oidc/OIDCController.ts index f6c6c8727..d3b80fa9d 100644 --- a/src/backend/controllers/oidc/OIDCController.ts +++ b/src/backend/controllers/oidc/OIDCController.ts @@ -166,10 +166,19 @@ export class OIDCController extends PuterController { } } + const rawReferrer = Array.isArray(req.query.referrer) + ? req.query.referrer[0] + : req.query.referrer; + const referrer = + rawReferrer != null && rawReferrer !== '' + ? String(rawReferrer) + : null; + const statePayload: Record = { provider, redirect_uri: appRedirectUri, }; + if (referrer) statePayload.referrer = referrer; if (embeddedInPopup && msgId) { statePayload.embedded_in_popup = true; statePayload.msg_id = msgId; @@ -233,6 +242,7 @@ export class OIDCController extends PuterController { const resolved = await this.#resolveOrCreateOIDCUser( provider, userinfo, + (stateDecoded.referrer as string) ?? null, ); if ('error' in resolved) { console.warn( @@ -293,6 +303,7 @@ export class OIDCController extends PuterController { const resolved = await this.#resolveOrCreateOIDCUser( provider, userinfo, + (stateDecoded.referrer as string) ?? null, ); if ('error' in resolved) { return res.redirect( @@ -436,6 +447,7 @@ if (window.opener) { async #resolveOrCreateOIDCUser( provider: string, userinfo: { sub: string; email?: unknown; [k: string]: unknown }, + referrer?: string | null, ): Promise< | { error: string } | { @@ -480,6 +492,7 @@ if (window.opener) { const outcome = await this.services.oidc.createUserFromOIDC( provider, userinfo as { sub: string; email?: string }, + referrer, ); if (!outcome.success || !outcome.user) { return { error: outcome.error ?? 'Account creation failed.' }; diff --git a/src/backend/services/auth/OIDCService.ts b/src/backend/services/auth/OIDCService.ts index 9350b2a0c..78ec9fd3d 100644 --- a/src/backend/services/auth/OIDCService.ts +++ b/src/backend/services/auth/OIDCService.ts @@ -360,6 +360,7 @@ export class OIDCService extends PuterService { async createUserFromOIDC( providerId: string, claims: OIDCUserInfo, + referrer?: string | null, ): Promise<{ success: boolean; user?: UserRow; error?: string }> { if (claims.email_verified === false) { return { @@ -479,7 +480,7 @@ export class OIDCService extends PuterService { signup_user_agent: req?.headers?.['user-agent'] ?? null, signup_origin: req?.headers?.origin, signup_server: this.config.serverId, - referrer: req?.body?.referrer ?? null, + referrer: referrer ?? null, }); if (!created) { diff --git a/src/backend/stores/fs/FSEntry.js b/src/backend/stores/fs/FSEntry.js new file mode 100644 index 000000000..dbaa304d2 --- /dev/null +++ b/src/backend/stores/fs/FSEntry.js @@ -0,0 +1,3 @@ +'use strict'; +Object.defineProperty(exports, '__esModule', { value: true }); +//# sourceMappingURL=FSEntry.js.map diff --git a/src/gui/src/UI/UIWindowLogin.js b/src/gui/src/UI/UIWindowLogin.js index ec8da0720..2f160e247 100644 --- a/src/gui/src/UI/UIWindowLogin.js +++ b/src/gui/src/UI/UIWindowLogin.js @@ -397,6 +397,10 @@ async function UIWindowLogin (options) { $(el_window).find(btnClass).css('display', 'flex'); $(el_window).find(btnClass).on('click', function () { let url = `${window.gui_origin}/auth/oidc/${provider}/start?flow=login`; + const referrer = options.referrer ?? window.referrerStr; + if ( referrer ) { + url += `&referrer=${encodeURIComponent(referrer)}`; + } if ( window.embedded_in_popup && window.url_query_params?.get('msg_id') ) { url += `&embedded_in_popup=true&msg_id=${encodeURIComponent(window.url_query_params.get('msg_id'))}`; if ( window.openerOrigin ) { diff --git a/src/gui/src/UI/UIWindowSignup.js b/src/gui/src/UI/UIWindowSignup.js index f0a4df075..4d559545c 100644 --- a/src/gui/src/UI/UIWindowSignup.js +++ b/src/gui/src/UI/UIWindowSignup.js @@ -178,6 +178,10 @@ function UIWindowSignup (options) { $(el_window).find(btnClass).css('display', 'flex'); $(el_window).find(btnClass).on('click', function () { let url = `${window.gui_origin}/auth/oidc/${provider}/start?flow=signup`; + const referrer = options.referrer ?? window.referrerStr; + if ( referrer ) { + url += `&referrer=${encodeURIComponent(referrer)}`; + } if ( window.embedded_in_popup && window.url_query_params?.get('msg_id') ) { url += `&embedded_in_popup=true&msg_id=${encodeURIComponent(window.url_query_params.get('msg_id'))}`; if ( window.openerOrigin ) {