@@ -16,6 +16,7 @@ import {
1616} from '@/components/emcn'
1717import { client } from '@/lib/auth/auth-client'
1818import { getEnv , isFalsy , isTruthy } from '@/lib/core/config/env'
19+ import { validateCallbackUrl } from '@/lib/core/security/input-validation'
1920import { cn } from '@/lib/core/utils/cn'
2021import { getBaseUrl } from '@/lib/core/utils/urls'
2122import { quickValidateEmail } from '@/lib/messaging/email/validation'
@@ -53,24 +54,6 @@ const PASSWORD_VALIDATIONS = {
5354 } ,
5455}
5556
56- const validateCallbackUrl = ( url : string ) : boolean => {
57- try {
58- if ( url . startsWith ( '/' ) ) {
59- return true
60- }
61-
62- const currentOrigin = typeof window !== 'undefined' ? window . location . origin : ''
63- if ( url . startsWith ( currentOrigin ) ) {
64- return true
65- }
66-
67- return false
68- } catch ( error ) {
69- logger . error ( 'Error validating callback URL:' , { error, url } )
70- return false
71- }
72- }
73-
7457const validatePassword = ( passwordValue : string ) : string [ ] => {
7558 const errors : string [ ] = [ ]
7659
@@ -106,13 +89,13 @@ export default function LoginPage({
10689 const buttonClass = useBrandedButtonClass ( )
10790
10891 const callbackUrlParam = searchParams ?. get ( 'callbackUrl' )
92+ const isValidCallbackUrl = callbackUrlParam ? validateCallbackUrl ( callbackUrlParam ) : false
10993 const invalidCallbackRef = useRef ( false )
110- if ( callbackUrlParam && ! validateCallbackUrl ( callbackUrlParam ) && ! invalidCallbackRef . current ) {
94+ if ( callbackUrlParam && ! isValidCallbackUrl && ! invalidCallbackRef . current ) {
11195 invalidCallbackRef . current = true
11296 logger . warn ( 'Invalid callback URL detected and blocked:' , { url : callbackUrlParam } )
11397 }
114- const callbackUrl =
115- callbackUrlParam && validateCallbackUrl ( callbackUrlParam ) ? callbackUrlParam : '/workspace'
98+ const callbackUrl = isValidCallbackUrl ? callbackUrlParam ! : '/workspace'
11699 const isInviteFlow = searchParams ?. get ( 'invite_flow' ) === 'true'
117100
118101 const [ forgotPasswordOpen , setForgotPasswordOpen ] = useState ( false )
@@ -192,7 +175,7 @@ export default function LoginPage({
192175 }
193176
194177 try {
195- const safeCallbackUrl = validateCallbackUrl ( callbackUrl ) ? callbackUrl : '/workspace'
178+ const safeCallbackUrl = callbackUrl
196179 let errorHandled = false
197180
198181 const result = await client . signIn . email (
0 commit comments