@@ -41,6 +41,7 @@ import {
4141 splitMxid ,
4242 getSupportedLoginFlows ,
4343 getAuthMetadata ,
44+ resolveBaseUrlWithWellKnown ,
4445} from "../synapse/matrix" ;
4546import { SetExternalAuthProvider } from "../utils/config" ;
4647
@@ -119,14 +120,15 @@ const LoginPage = () => {
119120 const [ oidcUrl , setOIDCUrl ] = useState ( "" ) ;
120121 const [ ssoBaseUrl , setSSOBaseUrl ] = useState ( "" ) ;
121122 const [ baseUrl , setBaseUrl ] = useState ( base_url || "" ) ;
123+ const [ resolvedBaseUrl , setResolvedBaseUrl ] = useState ( base_url || "" ) ;
122124 const loginToken = new URLSearchParams ( window . location . search ) . get ( "loginToken" ) ;
123125 const [ loginMethod , setLoginMethod ] = useState < LoginMethod > ( "credentials" ) ;
124126 const [ serverVersion , setServerVersion ] = useState ( "" ) ;
125127 const [ matrixVersions , setMatrixVersions ] = useState ( "" ) ;
126128
127129 useEffect ( ( ) => {
128130 if ( base_url ) {
129- checkServerInfo ( base_url as string ) ;
131+ resolveAndCheckServerInfo ( base_url as string ) ;
130132 }
131133 // eslint-disable-next-line react-hooks/exhaustive-deps
132134 } , [ ] ) ;
@@ -177,7 +179,12 @@ const LoginPage = () => {
177179 const cleanUrl = window . location . href . replace ( window . location . search , "" ) ;
178180 window . history . replaceState ( { } , "" , cleanUrl ) ;
179181
180- login ( auth ) . catch ( error => {
182+ const authWithResolved = {
183+ ...auth ,
184+ base_url : resolvedBaseUrl || auth . base_url ,
185+ } ;
186+
187+ login ( authWithResolved ) . catch ( error => {
181188 setLoading ( false ) ;
182189 notify (
183190 typeof error === "string"
@@ -213,6 +220,7 @@ const LoginPage = () => {
213220 setMatrixVersions ( "" ) ;
214221 setOIDCUrl ( "" ) ;
215222 setBaseUrl ( "" ) ;
223+ setResolvedBaseUrl ( "" ) ;
216224 setSupportPassAuth ( false ) ;
217225 return ;
218226 }
@@ -237,6 +245,7 @@ const LoginPage = () => {
237245 const supportPass = loginFlows . find ( f => f . type === "m.login.password" ) !== undefined ;
238246 const supportSSO = loginFlows . find ( f => f . type === "m.login.sso" ) !== undefined ;
239247 setBaseUrl ( url ) ;
248+ setResolvedBaseUrl ( url ) ;
240249 setSupportPassAuth ( supportPass ) ;
241250 setSSOBaseUrl ( supportSSO ? url : "" ) ;
242251
@@ -267,7 +276,25 @@ const LoginPage = () => {
267276 setSSOBaseUrl ( "" ) ;
268277 setOIDCUrl ( "" ) ;
269278 setBaseUrl ( "" ) ;
279+ setResolvedBaseUrl ( "" ) ;
280+ }
281+ } ;
282+
283+ const resolveAndCheckServerInfo = async ( url : string , updateFormValue ?: ( nextUrl : string ) => void ) => {
284+ if ( ! url ) {
285+ return ;
286+ }
287+
288+ if ( ! isValidBaseUrl ( url ) ) {
289+ checkServerInfo ( url ) ;
290+ return ;
291+ }
292+
293+ const resolvedUrl = await resolveBaseUrlWithWellKnown ( url ) ;
294+ if ( resolvedUrl !== url && updateFormValue ) {
295+ updateFormValue ( resolvedUrl ) ;
270296 }
297+ checkServerInfo ( resolvedUrl ) ;
271298 } ;
272299
273300 const icfg = useInstanceConfig ( ) ;
@@ -300,6 +327,7 @@ const LoginPage = () => {
300327 shouldValidate : true ,
301328 shouldDirty : true ,
302329 } ) ;
330+ setResolvedBaseUrl ( url ) ;
303331 checkServerInfo ( url ) ;
304332 }
305333 }
@@ -315,7 +343,15 @@ const LoginPage = () => {
315343
316344 // Trigger validation only when user finishes typing/selecting
317345 form . trigger ( "base_url" ) ;
318- checkServerInfo ( value ) ;
346+ const updateFormValue =
347+ restrictBaseUrlMultiple || restrictBaseUrlSingle
348+ ? undefined
349+ : ( nextUrl : string ) =>
350+ form . setValue ( "base_url" , nextUrl , {
351+ shouldValidate : true ,
352+ shouldDirty : true ,
353+ } ) ;
354+ resolveAndCheckServerInfo ( value , updateFormValue ) ;
319355 } ;
320356
321357 useEffect ( ( ) => {
@@ -355,7 +391,15 @@ const LoginPage = () => {
355391 shouldValidate : true ,
356392 shouldDirty : true ,
357393 } ) ;
358- checkServerInfo ( serverURL ) ;
394+ const updateFormValue =
395+ restrictBaseUrlMultiple || restrictBaseUrlSingle
396+ ? undefined
397+ : ( nextUrl : string ) =>
398+ form . setValue ( "base_url" , nextUrl , {
399+ shouldValidate : true ,
400+ shouldDirty : true ,
401+ } ) ;
402+ resolveAndCheckServerInfo ( serverURL , updateFormValue ) ;
359403 }
360404 } , 0 ) ;
361405
0 commit comments