mirror of https://github.com/vector-im/riot-web
				
				
				
			Bring server config juggling into MatrixChat
This way the server config is consistent across login, password reset, and registration. This also brings the code into a more generic place for all 3 duplicated efforts.pull/21833/head
							parent
							
								
									0b1a0c77b7
								
							
						
					
					
						commit
						1f527e71b1
					
				|  | @ -50,8 +50,7 @@ import SettingsStore, {SettingLevel} from "../../settings/SettingsStore"; | |||
| import { startAnyRegistrationFlow } from "../../Registration.js"; | ||||
| import { messageForSyncError } from '../../utils/ErrorUtils'; | ||||
| import ResizeNotifier from "../../utils/ResizeNotifier"; | ||||
| 
 | ||||
| const AutoDiscovery = Matrix.AutoDiscovery; | ||||
| import {ValidatedDiscoveryConfig} from "../../utils/AutoDiscoveryUtils"; | ||||
| 
 | ||||
| // Disable warnings for now: we use deprecated bluebird functions
 | ||||
| // and need to migrate, but they spam the console with warnings.
 | ||||
|  | @ -181,16 +180,8 @@ export default React.createClass({ | |||
|             // Parameters used in the registration dance with the IS
 | ||||
|             register_client_secret: null, | ||||
|             register_session_id: null, | ||||
|             register_hs_url: null, | ||||
|             register_is_url: null, | ||||
|             register_id_sid: null, | ||||
| 
 | ||||
|             // Parameters used for setting up the authentication views
 | ||||
|             defaultServerName: this.props.config.default_server_name, | ||||
|             defaultHsUrl: this.props.config.default_hs_url, | ||||
|             defaultIsUrl: this.props.config.default_is_url, | ||||
|             defaultServerDiscoveryError: null, | ||||
| 
 | ||||
|             // When showing Modal dialogs we need to set aria-hidden on the root app element
 | ||||
|             // and disable it when there are no dialogs
 | ||||
|             hideToSRUsers: false, | ||||
|  | @ -211,42 +202,15 @@ export default React.createClass({ | |||
|         }; | ||||
|     }, | ||||
| 
 | ||||
|     getDefaultServerName: function() { | ||||
|         return this.state.defaultServerName; | ||||
|     }, | ||||
| 
 | ||||
|     getCurrentHsUrl: function() { | ||||
|         if (this.state.register_hs_url) { | ||||
|             return this.state.register_hs_url; | ||||
|         } else if (MatrixClientPeg.get()) { | ||||
|             return MatrixClientPeg.get().getHomeserverUrl(); | ||||
|         } else { | ||||
|             return this.getDefaultHsUrl(); | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     getDefaultHsUrl(defaultToMatrixDotOrg) { | ||||
|         defaultToMatrixDotOrg = typeof(defaultToMatrixDotOrg) !== 'boolean' ? true : defaultToMatrixDotOrg; | ||||
|         if (!this.state.defaultHsUrl && defaultToMatrixDotOrg) return "https://matrix.org"; | ||||
|         return this.state.defaultHsUrl; | ||||
|     }, | ||||
| 
 | ||||
|     // TODO: TravisR - Remove this or put it somewhere else
 | ||||
|     getFallbackHsUrl: function() { | ||||
|         return this.props.config.fallback_hs_url; | ||||
|     }, | ||||
| 
 | ||||
|     getCurrentIsUrl: function() { | ||||
|         if (this.state.register_is_url) { | ||||
|             return this.state.register_is_url; | ||||
|         } else if (MatrixClientPeg.get()) { | ||||
|             return MatrixClientPeg.get().getIdentityServerUrl(); | ||||
|         } else { | ||||
|             return this.getDefaultIsUrl(); | ||||
|         } | ||||
|     }, | ||||
| 
 | ||||
|     getDefaultIsUrl() { | ||||
|         return this.state.defaultIsUrl || "https://vector.im"; | ||||
|     getServerProperties() { | ||||
|         let props = this.state.serverConfig; | ||||
|         if (!props) props = SdkConfig.get()["validated_server_config"]; | ||||
|         return {serverConfig: props}; | ||||
|     }, | ||||
| 
 | ||||
|     componentWillMount: function() { | ||||
|  | @ -260,40 +224,6 @@ export default React.createClass({ | |||
|             MatrixClientPeg.opts.initialSyncLimit = this.props.config.sync_timeline_limit; | ||||
|         } | ||||
| 
 | ||||
|         // Set up the default URLs (async)
 | ||||
|         if (this.getDefaultServerName() && !this.getDefaultHsUrl(false)) { | ||||
|             this.setState({loadingDefaultHomeserver: true}); | ||||
|             this._tryDiscoverDefaultHomeserver(this.getDefaultServerName()); | ||||
|         } else if (this.getDefaultServerName() && this.getDefaultHsUrl(false)) { | ||||
|             // Ideally we would somehow only communicate this to the server admins, but
 | ||||
|             // given this is at login time we can't really do much besides hope that people
 | ||||
|             // will check their settings.
 | ||||
|             this.setState({ | ||||
|                 defaultServerName: null, // To un-hide any secrets people might be keeping
 | ||||
|                 defaultServerDiscoveryError: _t( | ||||
|                     "Invalid configuration: Cannot supply a default homeserver URL and " + | ||||
|                     "a default server name", | ||||
|                 ), | ||||
|             }); | ||||
|         } | ||||
| 
 | ||||
|         // Set a default HS with query param `hs_url`
 | ||||
|         const paramHs = this.props.startingFragmentQueryParams.hs_url; | ||||
|         if (paramHs) { | ||||
|             console.log('Setting register_hs_url ', paramHs); | ||||
|             this.setState({ | ||||
|                 register_hs_url: paramHs, | ||||
|             }); | ||||
|         } | ||||
|         // Set a default IS with query param `is_url`
 | ||||
|         const paramIs = this.props.startingFragmentQueryParams.is_url; | ||||
|         if (paramIs) { | ||||
|             console.log('Setting register_is_url ', paramIs); | ||||
|             this.setState({ | ||||
|                 register_is_url: paramIs, | ||||
|             }); | ||||
|         } | ||||
| 
 | ||||
|         // a thing to call showScreen with once login completes.  this is kept
 | ||||
|         // outside this.state because updating it should never trigger a
 | ||||
|         // rerender.
 | ||||
|  | @ -374,8 +304,8 @@ export default React.createClass({ | |||
|             return Lifecycle.loadSession({ | ||||
|                 fragmentQueryParams: this.props.startingFragmentQueryParams, | ||||
|                 enableGuest: this.props.enableGuest, | ||||
|                 guestHsUrl: this.getCurrentHsUrl(), | ||||
|                 guestIsUrl: this.getCurrentIsUrl(), | ||||
|                 guestHsUrl: this.getServerProperties().serverConfig.hsUrl, | ||||
|                 guestIsUrl: this.getServerProperties().serverConfig.isUrl, | ||||
|                 defaultDeviceDisplayName: this.props.defaultDeviceDisplayName, | ||||
|             }); | ||||
|         }).then((loadedSession) => { | ||||
|  | @ -1823,44 +1753,7 @@ export default React.createClass({ | |||
|     }, | ||||
| 
 | ||||
|     onServerConfigChange(config) { | ||||
|         const newState = {}; | ||||
|         if (config.hsUrl) { | ||||
|             newState.register_hs_url = config.hsUrl; | ||||
|         } | ||||
|         if (config.isUrl) { | ||||
|             newState.register_is_url = config.isUrl; | ||||
|         } | ||||
|         this.setState(newState); | ||||
|     }, | ||||
| 
 | ||||
|     _tryDiscoverDefaultHomeserver: async function(serverName) { | ||||
|         try { | ||||
|             const discovery = await AutoDiscovery.findClientConfig(serverName); | ||||
|             const state = discovery["m.homeserver"].state; | ||||
|             if (state !== AutoDiscovery.SUCCESS) { | ||||
|                 console.error("Failed to discover homeserver on startup:", discovery); | ||||
|                 this.setState({ | ||||
|                     defaultServerDiscoveryError: discovery["m.homeserver"].error, | ||||
|                     loadingDefaultHomeserver: false, | ||||
|                 }); | ||||
|             } else { | ||||
|                 const hsUrl = discovery["m.homeserver"].base_url; | ||||
|                 const isUrl = discovery["m.identity_server"].state === AutoDiscovery.SUCCESS | ||||
|                     ? discovery["m.identity_server"].base_url | ||||
|                     : "https://vector.im"; | ||||
|                 this.setState({ | ||||
|                     defaultHsUrl: hsUrl, | ||||
|                     defaultIsUrl: isUrl, | ||||
|                     loadingDefaultHomeserver: false, | ||||
|                 }); | ||||
|             } | ||||
|         } catch (e) { | ||||
|             console.error(e); | ||||
|             this.setState({ | ||||
|                 defaultServerDiscoveryError: _t("Unknown error discovering homeserver"), | ||||
|                 loadingDefaultHomeserver: false, | ||||
|             }); | ||||
|         } | ||||
|         this.setState({serverConfig: config}); | ||||
|     }, | ||||
| 
 | ||||
|     _makeRegistrationUrl: function(params) { | ||||
|  | @ -1879,8 +1772,7 @@ export default React.createClass({ | |||
| 
 | ||||
|         if ( | ||||
|             this.state.view === VIEWS.LOADING || | ||||
|             this.state.view === VIEWS.LOGGING_IN || | ||||
|             this.state.loadingDefaultHomeserver | ||||
|             this.state.view === VIEWS.LOGGING_IN | ||||
|         ) { | ||||
|             const Spinner = sdk.getComponent('elements.Spinner'); | ||||
|             return ( | ||||
|  | @ -1958,18 +1850,13 @@ export default React.createClass({ | |||
|                     sessionId={this.state.register_session_id} | ||||
|                     idSid={this.state.register_id_sid} | ||||
|                     email={this.props.startingFragmentQueryParams.email} | ||||
|                     defaultServerName={this.getDefaultServerName()} | ||||
|                     defaultServerDiscoveryError={this.state.defaultServerDiscoveryError} | ||||
|                     defaultHsUrl={this.getDefaultHsUrl()} | ||||
|                     defaultIsUrl={this.getDefaultIsUrl()} | ||||
|                     brand={this.props.config.brand} | ||||
|                     customHsUrl={this.getCurrentHsUrl()} | ||||
|                     customIsUrl={this.getCurrentIsUrl()} | ||||
|                     makeRegistrationUrl={this._makeRegistrationUrl} | ||||
|                     onLoggedIn={this.onRegistered} | ||||
|                     onLoginClick={this.onLoginClick} | ||||
|                     onServerConfigChange={this.onServerConfigChange} | ||||
|                     /> | ||||
|                     {...this.getServerProperties()} | ||||
|                 /> | ||||
|             ); | ||||
|         } | ||||
| 
 | ||||
|  | @ -1978,14 +1865,11 @@ export default React.createClass({ | |||
|             const ForgotPassword = sdk.getComponent('structures.auth.ForgotPassword'); | ||||
|             return ( | ||||
|                 <ForgotPassword | ||||
|                     defaultServerName={this.getDefaultServerName()} | ||||
|                     defaultServerDiscoveryError={this.state.defaultServerDiscoveryError} | ||||
|                     defaultHsUrl={this.getDefaultHsUrl()} | ||||
|                     defaultIsUrl={this.getDefaultIsUrl()} | ||||
|                     customHsUrl={this.getCurrentHsUrl()} | ||||
|                     customIsUrl={this.getCurrentIsUrl()} | ||||
|                     onComplete={this.onLoginClick} | ||||
|                     onLoginClick={this.onLoginClick} /> | ||||
|                     onLoginClick={this.onLoginClick} | ||||
|                     onServerConfigChange={this.onServerConfigChange} | ||||
|                     {...this.getServerProperties()} | ||||
|                 /> | ||||
|             ); | ||||
|         } | ||||
| 
 | ||||
|  | @ -1995,16 +1879,11 @@ export default React.createClass({ | |||
|                 <Login | ||||
|                     onLoggedIn={Lifecycle.setLoggedIn} | ||||
|                     onRegisterClick={this.onRegisterClick} | ||||
|                     defaultServerName={this.getDefaultServerName()} | ||||
|                     defaultServerDiscoveryError={this.state.defaultServerDiscoveryError} | ||||
|                     defaultHsUrl={this.getDefaultHsUrl()} | ||||
|                     defaultIsUrl={this.getDefaultIsUrl()} | ||||
|                     customHsUrl={this.getCurrentHsUrl()} | ||||
|                     customIsUrl={this.getCurrentIsUrl()} | ||||
|                     fallbackHsUrl={this.getFallbackHsUrl()} | ||||
|                     defaultDeviceDisplayName={this.props.defaultDeviceDisplayName} | ||||
|                     onForgotPasswordClick={this.onForgotPasswordClick} | ||||
|                     onServerConfigChange={this.onServerConfigChange} | ||||
|                     {...this.getServerProperties()} | ||||
|                 /> | ||||
|             ); | ||||
|         } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue
	
	 Travis Ralston
						Travis Ralston