@@ -17,6 +17,7 @@ export const dynamic = 'force-dynamic'
1717export const GET = withRouteHandler ( async ( request : NextRequest ) => {
1818 const baseUrl = getBaseUrl ( )
1919 const fallbackUrl = `${ baseUrl } /workspace`
20+ let validatedReturnUrl : URL | null = null
2021
2122 try {
2223 const session = await getSession ( )
@@ -33,14 +34,14 @@ export const GET = withRouteHandler(async (request: NextRequest) => {
3334 if ( ! isSameOrigin ( state . returnUrl ) ) {
3435 throw new Error ( 'QuickBooks OAuth state contains an invalid return URL' )
3536 }
36- const returnUrl = new URL ( state . returnUrl )
37+ validatedReturnUrl = new URL ( state . returnUrl )
3738 if ( parsed . data . query . error ) {
3839 logger . warn ( 'QuickBooks OAuth authorization was not completed' , {
3940 error : parsed . data . query . error ,
4041 hasDescription : Boolean ( parsed . data . query . error_description ) ,
4142 } )
42- returnUrl . searchParams . set ( 'error' , 'quickbooks_access_denied' )
43- return NextResponse . redirect ( returnUrl )
43+ validatedReturnUrl . searchParams . set ( 'error' , 'quickbooks_access_denied' )
44+ return NextResponse . redirect ( validatedReturnUrl )
4445 }
4546 if ( ! parsed . data . query . code || ! parsed . data . query . realmId ) {
4647 throw new Error ( 'QuickBooks callback is missing its authorization code or company identity' )
@@ -62,10 +63,12 @@ export const GET = withRouteHandler(async (request: NextRequest) => {
6263 request,
6364 } )
6465
65- returnUrl . searchParams . set ( 'quickbooks_connected' , 'true' )
66- return NextResponse . redirect ( returnUrl )
66+ validatedReturnUrl . searchParams . set ( 'quickbooks_connected' , 'true' )
67+ return NextResponse . redirect ( validatedReturnUrl )
6768 } catch ( error ) {
6869 logger . error ( 'QuickBooks OAuth callback failed' , { error } )
69- return NextResponse . redirect ( `${ fallbackUrl } ?error=quickbooks_callback_error` )
70+ const errorUrl = validatedReturnUrl ?? new URL ( fallbackUrl )
71+ errorUrl . searchParams . set ( 'error' , 'quickbooks_callback_error' )
72+ return NextResponse . redirect ( errorUrl )
7073 }
7174} )
0 commit comments