diff --git a/src/Lifecycle.js b/src/Lifecycle.js index ed057eb020..54ac605c65 100644 --- a/src/Lifecycle.js +++ b/src/Lifecycle.js @@ -27,7 +27,6 @@ import UserActivity from './UserActivity'; import Presence from './Presence'; import dis from './dispatcher'; import DMRoomMap from './utils/DMRoomMap'; -import RtsClient from './RtsClient'; import Modal from './Modal'; import sdk from './index'; import ActiveWidgetStore from './stores/ActiveWidgetStore'; @@ -224,7 +223,7 @@ function _registerAsGuest(hsUrl, isUrl, defaultDeviceDisplayName) { // // The plan is to gradually move the localStorage access done here into // SessionStore to avoid bugs where the view becomes out-of-sync with -// localStorage (e.g. teamToken, isGuest etc.) +// localStorage (e.g. isGuest etc.) async function _restoreFromLocalStorage() { if (!localStorage) { return false; @@ -286,15 +285,6 @@ function _handleLoadSessionFailure(e) { }); } -let rtsClient = null; -export function initRtsClient(url) { - if (url) { - rtsClient = new RtsClient(url); - } else { - rtsClient = null; - } -} - /** * Transitions to a logged-in state using the given credentials. * @@ -333,7 +323,7 @@ async function _doSetLoggedIn(credentials, clearStorage) { ); // This is dispatched to indicate that the user is still in the process of logging in - // because `teamPromise` may take some time to resolve, breaking the assumption that + // because async code may take some time to resolve, breaking the assumption that // `setLoggedIn` takes an "instant" to complete, and dispatch `on_logged_in` a few ms // later than MatrixChat might assume. // @@ -347,10 +337,6 @@ async function _doSetLoggedIn(credentials, clearStorage) { Analytics.setLoggedIn(credentials.guest, credentials.homeserverUrl, credentials.identityServerUrl); - // Resolves by default - let teamPromise = Promise.resolve(null); - - if (localStorage) { try { _persistCredentialsToLocalStorage(credentials); @@ -367,27 +353,13 @@ async function _doSetLoggedIn(credentials, clearStorage) { } catch (e) { console.warn("Error using local storage: can't persist session!", e); } - - if (rtsClient && !credentials.guest) { - teamPromise = rtsClient.login(credentials.userId).then((body) => { - if (body.team_token) { - localStorage.setItem("mx_team_token", body.team_token); - } - return body.team_token; - }, (err) => { - console.warn(`Failed to get team token on login: ${err}` ); - return null; - }); - } } else { console.warn("No local storage available: can't persist session!"); } MatrixClientPeg.replaceUsingCreds(credentials); - teamPromise.then((teamToken) => { - dis.dispatch({action: 'on_logged_in', teamToken: teamToken}); - }); + dis.dispatch({ action: 'on_logged_in' }); await startMatrixClient(); return MatrixClientPeg.get(); diff --git a/src/RtsClient.js b/src/RtsClient.js deleted file mode 100644 index 493b19599c..0000000000 --- a/src/RtsClient.js +++ /dev/null @@ -1,104 +0,0 @@ -import 'whatwg-fetch'; - -let fetchFunction = fetch; - -function checkStatus(response) { - if (!response.ok) { - return response.text().then((text) => { - throw new Error(text); - }); - } - return response; -} - -function parseJson(response) { - return response.json(); -} - -function encodeQueryParams(params) { - return '?' + Object.keys(params).map((k) => { - return k + '=' + encodeURIComponent(params[k]); - }).join('&'); -} - -const request = (url, opts) => { - if (opts && opts.qs) { - url += encodeQueryParams(opts.qs); - delete opts.qs; - } - if (opts && opts.body) { - if (!opts.headers) { - opts.headers = {}; - } - opts.body = JSON.stringify(opts.body); - opts.headers['Content-Type'] = 'application/json'; - } - return fetchFunction(url, opts) - .then(checkStatus) - .then(parseJson); -}; - - -export default class RtsClient { - constructor(url) { - this._url = url; - } - - getTeamsConfig() { - return request(this._url + '/teams'); - } - - /** - * Track a referral with the Riot Team Server. This should be called once a referred - * user has been successfully registered. - * @param {string} referrer the user ID of one who referred the user to Riot. - * @param {string} sid the sign-up identity server session ID . - * @param {string} clientSecret the sign-up client secret. - * @returns {Promise} a promise that resolves to { team_token: 'sometoken' } upon - * success. - */ - trackReferral(referrer, sid, clientSecret) { - return request(this._url + '/register', - { - body: { - referrer: referrer, - session_id: sid, - client_secret: clientSecret, - }, - method: 'POST', - }, - ); - } - - getTeam(teamToken) { - return request(this._url + '/teamConfiguration', - { - qs: { - team_token: teamToken, - }, - }, - ); - } - - /** - * Signal to the RTS that a login has occurred and that a user requires their team's - * token. - * @param {string} userId the user ID of the user who is a member of a team. - * @returns {Promise} a promise that resolves to { team_token: 'sometoken' } upon - * success. - */ - login(userId) { - return request(this._url + '/login', - { - qs: { - user_id: userId, - }, - }, - ); - } - - // allow fetch to be replaced, for testing. - static setFetch(fn) { - fetchFunction = fn; - } -} diff --git a/src/components/structures/HomePage.js b/src/components/structures/HomePage.js index aa17e63d73..948a07ee59 100644 --- a/src/components/structures/HomePage.js +++ b/src/components/structures/HomePage.js @@ -30,11 +30,6 @@ class HomePage extends React.Component { static displayName = 'HomePage'; static propTypes = { - // URL base of the team server. Optional. - teamServerUrl: PropTypes.string, - // Team token. Optional. If set, used to get the static homepage of the team - // associated. If unset, homePageUrl will be used. - teamToken: PropTypes.string, // URL to use as the iFrame src. Defaults to /home.html. homePageUrl: PropTypes.string, }; @@ -56,35 +51,29 @@ class HomePage extends React.Component { componentWillMount() { this._unmounted = false; - if (this.props.teamToken && this.props.teamServerUrl) { - this.setState({ - iframeSrc: `${this.props.teamServerUrl}/static/${this.props.teamToken}/home.html`, - }); - } else { - // we use request() to inline the homepage into the react component - // so that it can inherit CSS and theming easily rather than mess around - // with iframes and trying to synchronise document.stylesheets. + // we use request() to inline the homepage into the react component + // so that it can inherit CSS and theming easily rather than mess around + // with iframes and trying to synchronise document.stylesheets. - const src = this.props.homePageUrl || 'home.html'; + const src = this.props.homePageUrl || 'home.html'; - request( - { method: "GET", url: src }, - (err, response, body) => { - if (this._unmounted) { - return; - } + request( + { method: "GET", url: src }, + (err, response, body) => { + if (this._unmounted) { + return; + } - if (err || response.status < 200 || response.status >= 300) { - console.warn(`Error loading home page: ${err}`); - this.setState({ page: _t("Couldn't load home page") }); - return; - } + if (err || response.status < 200 || response.status >= 300) { + console.warn(`Error loading home page: ${err}`); + this.setState({ page: _t("Couldn't load home page") }); + return; + } - body = body.replace(/_t\(['"]([\s\S]*?)['"]\)/mg, (match, g1)=>this.translate(g1)); - this.setState({ page: body }); - }, - ); - } + body = body.replace(/_t\(['"]([\s\S]*?)['"]\)/mg, (match, g1)=>this.translate(g1)); + this.setState({ page: body }); + }, + ); } componentWillUnmount() { diff --git a/src/components/structures/LoggedInView.js b/src/components/structures/LoggedInView.js index 6f2e1f3989..645782a854 100644 --- a/src/components/structures/LoggedInView.js +++ b/src/components/structures/LoggedInView.js @@ -63,7 +63,6 @@ const LoggedInView = React.createClass({ // transitioned to PWLU) onRegistered: PropTypes.func, collapsedRhs: PropTypes.bool, - teamToken: PropTypes.string, // Used by the RoomView to handle joining rooms viaServers: PropTypes.arrayOf(PropTypes.string), @@ -457,8 +456,6 @@ const LoggedInView = React.createClass({ pageElement = <UserSettings onClose={this.props.onCloseAllSettings} brand={this.props.config.brand} - referralBaseUrl={this.props.config.referralBaseUrl} - teamToken={this.props.teamToken} />; break; @@ -475,15 +472,7 @@ const LoggedInView = React.createClass({ case PageTypes.HomePage: { - // If team server config is present, pass the teamServerURL. props.teamToken - // must also be set for the team page to be displayed, otherwise the - // welcomePageUrl is used (which might be undefined). - const teamServerUrl = this.props.config.teamServerConfig ? - this.props.config.teamServerConfig.teamServerURL : null; - pageElement = <HomePage - teamServerUrl={teamServerUrl} - teamToken={this.props.teamToken} homePageUrl={this.props.config.welcomePageUrl} />; } diff --git a/src/components/structures/MatrixChat.js b/src/components/structures/MatrixChat.js index 305ee4ec2f..6803a7e6d8 100644 --- a/src/components/structures/MatrixChat.js +++ b/src/components/structures/MatrixChat.js @@ -75,8 +75,8 @@ const VIEWS = { // we have valid matrix credentials (either via an explicit login, via the // initial re-animation/guest registration, or via a registration), and are // now setting up a matrixclient to talk to it. This isn't an instant - // process because (a) we need to clear out indexeddb, and (b) we need to - // talk to the team server; while it is going on we show a big spinner. + // process because we need to clear out indexeddb. While it is going on we + // show a big spinner. LOGGING_IN: 5, // we are logged in with an active matrix client. @@ -256,42 +256,6 @@ export default React.createClass({ MatrixClientPeg.opts.initialSyncLimit = this.props.config.sync_timeline_limit; } - // To enable things like riot.im/geektime in a nicer way than rewriting the URL - // and appending a team token query parameter, use the first path segment to - // indicate a team, with "public" team tokens stored in the config teamTokenMap. - let routedTeamToken = null; - if (this.props.config.teamTokenMap) { - const teamName = window.location.pathname.split('/')[1]; - if (teamName && this.props.config.teamTokenMap.hasOwnProperty(teamName)) { - routedTeamToken = this.props.config.teamTokenMap[teamName]; - } - } - - // Persist the team token across refreshes using sessionStorage. A new window or - // tab will not persist sessionStorage, but refreshes will. - if (this.props.startingFragmentQueryParams.team_token) { - window.sessionStorage.setItem( - 'mx_team_token', - this.props.startingFragmentQueryParams.team_token, - ); - } - - // Use the locally-stored team token first, then as a fall-back, check to see if - // a referral link was used, which will contain a query parameter `team_token`. - this._teamToken = routedTeamToken || - window.localStorage.getItem('mx_team_token') || - window.sessionStorage.getItem('mx_team_token'); - - // Some users have ended up with "undefined" as their local storage team token, - // treat that as undefined. - if (this._teamToken === "undefined") { - this._teamToken = undefined; - } - - if (this._teamToken) { - console.info(`Team token set to ${this._teamToken}`); - } - // Set up the default URLs (async) if (this.getDefaultServerName() && !this.getDefaultHsUrl(false)) { this.setState({loadingDefaultHomeserver: true}); @@ -360,9 +324,6 @@ export default React.createClass({ linkifyMatrix.onGroupClick = this.onGroupClick; } - const teamServerConfig = this.props.config.teamServerConfig || {}; - Lifecycle.initRtsClient(teamServerConfig.teamServerURL); - // the first thing to do is to try the token params in the query-string Lifecycle.attemptTokenLogin(this.props.realQueryParams).then((loggedIn) => { if (loggedIn) { @@ -726,7 +687,7 @@ export default React.createClass({ }); break; case 'on_logged_in': - this._onLoggedIn(payload.teamToken); + this._onLoggedIn(); break; case 'on_logged_out': this._onLoggedOut(); @@ -1196,16 +1157,10 @@ export default React.createClass({ /** * Called when a new logged in session has started - * - * @param {string} teamToken */ - _onLoggedIn: async function(teamToken) { + _onLoggedIn: async function() { this.setStateForNewView({view: VIEWS.LOGGED_IN}); - if (teamToken) { - // A team member has logged in, not a guest - this._teamToken = teamToken; - dis.dispatch({action: 'view_home_page'}); - } else if (this._is_registered) { + if (this._is_registered) { this._is_registered = false; if (this.props.config.welcomeUserId && getCurrentLanguage().startsWith("en")) { @@ -1261,7 +1216,6 @@ export default React.createClass({ currentRoomId: null, page_type: PageTypes.RoomDirectory, }); - this._teamToken = null; this._setPageSubtitle(); }, @@ -1707,15 +1661,13 @@ export default React.createClass({ onReturnToAppClick: function() { // treat it the same as if the user had completed the login - this._onLoggedIn(null); + this._onLoggedIn(); }, // returns a promise which resolves to the new MatrixClient - onRegistered: function(credentials, teamToken) { - // XXX: These both should be in state or ideally store(s) because we risk not + onRegistered: function(credentials) { + // XXX: This should be in state or ideally store(s) because we risk not // rendering the most up-to-date view of state otherwise. - // teamToken may not be truthy - this._teamToken = teamToken; this._is_registered = true; return Lifecycle.setLoggedIn(credentials); }, @@ -1888,7 +1840,6 @@ export default React.createClass({ onCloseAllSettings={this.onCloseAllSettings} onRegistered={this.onRegistered} currentRoomId={this.state.currentRoomId} - teamToken={this._teamToken} showCookieBar={this.state.showCookieBar} {...this.props} {...this.state} @@ -1929,7 +1880,6 @@ export default React.createClass({ defaultHsUrl={this.getDefaultHsUrl()} defaultIsUrl={this.getDefaultIsUrl()} brand={this.props.config.brand} - teamServerConfig={this.props.config.teamServerConfig} customHsUrl={this.getCurrentHsUrl()} customIsUrl={this.getCurrentIsUrl()} makeRegistrationUrl={this._makeRegistrationUrl} diff --git a/src/components/structures/UserSettings.js b/src/components/structures/UserSettings.js index a3b4623168..f4a2c57aaf 100644 --- a/src/components/structures/UserSettings.js +++ b/src/components/structures/UserSettings.js @@ -167,13 +167,6 @@ module.exports = React.createClass({ onClose: PropTypes.func, // The brand string given when creating email pushers brand: PropTypes.string, - - // The base URL to use in the referral link. Defaults to window.location.origin. - referralBaseUrl: PropTypes.string, - - // Team token for the referral link. If falsy, the referral section will - // not appear - teamToken: PropTypes.string, }, getDefaultProps: function() { @@ -590,27 +583,6 @@ module.exports = React.createClass({ return <GroupUserSettings />; }, - _renderReferral: function() { - const teamToken = this.props.teamToken; - if (!teamToken) { - return null; - } - if (typeof teamToken !== 'string') { - console.warn('Team token not a string'); - return null; - } - const href = (this.props.referralBaseUrl || window.location.origin) + - `/#/register?referrer=${this._me}&team_token=${teamToken}`; - return ( - <div> - <h3>Referral</h3> - <div className="mx_UserSettings_section"> - { _t("Refer a friend to Riot:") } <a href={href} target="_blank" rel="noopener">{ href }</a> - </div> - </div> - ); - }, - onLanguageChange: function(newLang) { if (this.state.language !== newLang) { SettingsStore.setValue("language", null, SettingLevel.DEVICE, newLang); @@ -1355,8 +1327,6 @@ module.exports = React.createClass({ { this._renderGroupSettings() } - { this._renderReferral() } - { notificationArea } { this._renderUserInterfaceSettings() } diff --git a/src/components/structures/auth/Registration.js b/src/components/structures/auth/Registration.js index 8abd4073fe..acc45df86f 100644 --- a/src/components/structures/auth/Registration.js +++ b/src/components/structures/auth/Registration.js @@ -23,9 +23,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import sdk from '../../../index'; -import MatrixClientPeg from '../../../MatrixClientPeg'; import RegistrationForm from '../../views/auth/RegistrationForm'; -import RtsClient from '../../../RtsClient'; import { _t, _td } from '../../../languageHandler'; import SdkConfig from '../../../SdkConfig'; import { messageForResourceLimitError } from '../../../utils/ErrorUtils'; @@ -48,13 +46,6 @@ module.exports = React.createClass({ brand: PropTypes.string, email: PropTypes.string, referrer: PropTypes.string, - teamServerConfig: PropTypes.shape({ - // Email address to request new teams - supportEmail: PropTypes.string.isRequired, - // URL of the riot-team-server to get team configurations and track referrals - teamServerURL: PropTypes.string.isRequired, - }), - teamSelected: PropTypes.object, // The default server name to use when the user hasn't specified // one. This is used when displaying the defaultHsUrl in the UI. @@ -70,18 +61,11 @@ module.exports = React.createClass({ onLoginClick: PropTypes.func.isRequired, onCancelClick: PropTypes.func, onServerConfigChange: PropTypes.func.isRequired, - - rtsClient: PropTypes.shape({ - getTeamsConfig: PropTypes.func.isRequired, - trackReferral: PropTypes.func.isRequired, - getTeam: PropTypes.func.isRequired, - }), }, getInitialState: function() { return { busy: false, - teamServerBusy: false, errorText: null, // We remember the values entered by the user because // the registration form will be unmounted during the @@ -106,37 +90,7 @@ module.exports = React.createClass({ componentWillMount: function() { this._unmounted = false; - this._replaceClient(); - - if ( - this.props.teamServerConfig && - this.props.teamServerConfig.teamServerURL && - !this._rtsClient - ) { - this._rtsClient = this.props.rtsClient || new RtsClient(this.props.teamServerConfig.teamServerURL); - - this.setState({ - teamServerBusy: true, - }); - // GET team configurations including domains, names and icons - this._rtsClient.getTeamsConfig().then((data) => { - const teamsConfig = { - teams: data, - supportEmail: this.props.teamServerConfig.supportEmail, - }; - console.log('Setting teams config to ', teamsConfig); - this.setState({ - teamsConfig: teamsConfig, - teamServerBusy: false, - }); - }, (err) => { - console.error('Error retrieving config for teams', err); - this.setState({ - teamServerBusy: false, - }); - }); - } }, onServerConfigChange: function(config) { @@ -191,7 +145,7 @@ module.exports = React.createClass({ }); }, - _onUIAuthFinished: function(success, response, extra) { + _onUIAuthFinished: async function(success, response, extra) { if (!success) { let msg = response.message || response.toString(); // can we give a better error message? @@ -240,58 +194,15 @@ module.exports = React.createClass({ doingUIAuth: false, }); - // Done regardless of `teamSelected`. People registering with non-team emails - // will just nop. The point of this being we might not have the email address - // that the user registered with at this stage (depending on whether this - // is the client they initiated registration). - let trackPromise = Promise.resolve(null); - if (this._rtsClient && extra.emailSid) { - // Track referral if this.props.referrer set, get team_token in order to - // retrieve team config and see welcome page etc. - trackPromise = this._rtsClient.trackReferral( - this.props.referrer || '', // Default to empty string = not referred - extra.emailSid, - extra.clientSecret, - ).then((data) => { - const teamToken = data.team_token; - // Store for use /w welcome pages - window.localStorage.setItem('mx_team_token', teamToken); - - this._rtsClient.getTeam(teamToken).then((team) => { - console.log( - `User successfully registered with team ${team.name}`, - ); - if (!team.rooms) { - return; - } - // Auto-join rooms - team.rooms.forEach((room) => { - if (room.auto_join && room.room_id) { - console.log(`Auto-joining ${room.room_id}`); - MatrixClientPeg.get().joinRoom(room.room_id); - } - }); - }, (err) => { - console.error('Error getting team config', err); - }); - - return teamToken; - }, (err) => { - console.error('Error tracking referral', err); - }); - } - - trackPromise.then((teamToken) => { - return this.props.onLoggedIn({ - userId: response.user_id, - deviceId: response.device_id, - homeserverUrl: this._matrixClient.getHomeserverUrl(), - identityServerUrl: this._matrixClient.getIdentityServerUrl(), - accessToken: response.access_token, - }, teamToken); - }).then((cli) => { - return this._setupPushers(cli); + const cli = await this.props.onLoggedIn({ + userId: response.user_id, + deviceId: response.device_id, + homeserverUrl: this._matrixClient.getHomeserverUrl(), + identityServerUrl: this._matrixClient.getIdentityServerUrl(), + accessToken: response.access_token, }); + + this._setupPushers(cli); }, _setupPushers: function(matrixClient) { @@ -356,12 +267,6 @@ module.exports = React.createClass({ }); }, - onTeamSelected: function(teamSelected) { - if (!this._unmounted) { - this.setState({ teamSelected }); - } - }, - onLoginClick: function(ev) { ev.preventDefault(); ev.stopPropagation(); @@ -418,7 +323,7 @@ module.exports = React.createClass({ poll={true} /> ); - } else if (this.state.busy || this.state.teamServerBusy || !this.state.flows) { + } else if (this.state.busy || !this.state.flows) { registerBody = <Spinner />; } else { let serverConfigSection; @@ -443,11 +348,9 @@ module.exports = React.createClass({ defaultPhoneCountry={this.state.formVals.phoneCountry} defaultPhoneNumber={this.state.formVals.phoneNumber} defaultPassword={this.state.formVals.password} - teamsConfig={this.state.teamsConfig} minPasswordLength={MIN_PASSWORD_LENGTH} onError={this.onFormValidationFailed} onRegisterClick={this.onFormSubmit} - onTeamSelected={this.onTeamSelected} flows={this.state.flows} /> { serverConfigSection } @@ -472,12 +375,7 @@ module.exports = React.createClass({ return ( <AuthPage> - <AuthHeader - icon={this.state.teamSelected ? - this.props.teamServerConfig.teamServerURL + "/static/common/" + - this.state.teamSelected.domain + "/icon.png" : - null} - /> + <AuthHeader /> <AuthBody> <h2>{ _t('Create your account') }</h2> { registerBody } diff --git a/src/components/views/auth/RegistrationForm.js b/src/components/views/auth/RegistrationForm.js index 873442e122..b38d8ca361 100644 --- a/src/components/views/auth/RegistrationForm.js +++ b/src/components/views/auth/RegistrationForm.js @@ -46,17 +46,6 @@ module.exports = React.createClass({ defaultPhoneNumber: PropTypes.string, defaultUsername: PropTypes.string, defaultPassword: PropTypes.string, - teamsConfig: PropTypes.shape({ - // Email address to request new teams - supportEmail: PropTypes.string, - teams: PropTypes.arrayOf(PropTypes.shape({ - // The displayed name of the team - "name": PropTypes.string, - // The domain of team email addresses - "domain": PropTypes.string, - })).required, - }), - minPasswordLength: PropTypes.number, onError: PropTypes.func, onRegisterClick: PropTypes.func.isRequired, // onRegisterClick(Object) => ?Promise @@ -75,7 +64,6 @@ module.exports = React.createClass({ getInitialState: function() { return { fieldValid: {}, - selectedTeam: null, // The ISO2 country code selected in the phone number entry phoneCountry: this.props.defaultPhoneCountry, }; @@ -150,10 +138,6 @@ module.exports = React.createClass({ return true; }, - _isUniEmail: function(email) { - return email.endsWith('.ac.uk') || email.endsWith('.edu') || email.endsWith('matrix.org'); - }, - validateField: function(fieldID) { const pwd1 = this.refs.password.value.trim(); const pwd2 = this.refs.passwordConfirm.value.trim(); @@ -161,24 +145,6 @@ module.exports = React.createClass({ switch (fieldID) { case FIELD_EMAIL: { const email = this.refs.email.value; - if (this.props.teamsConfig && this._isUniEmail(email)) { - const matchingTeam = this.props.teamsConfig.teams.find( - (team) => { - return email.split('@').pop() === team.domain; - }, - ) || null; - this.setState({ - selectedTeam: matchingTeam, - showSupportEmail: !matchingTeam, - }); - this.props.onTeamSelected(matchingTeam); - } else { - this.props.onTeamSelected(null); - this.setState({ - selectedTeam: null, - showSupportEmail: false, - }); - } const emailValid = email === '' || Email.looksValid(email); if (this._authStepIsRequired('m.login.email.identity') && (!emailValid || email === '')) { this.markFieldValid(fieldID, false, "RegistrationForm.ERR_MISSING_EMAIL"); @@ -304,30 +270,6 @@ module.exports = React.createClass({ value={self.state.email} /> </div> ); - let belowEmailSection; - if (this.props.teamsConfig) { - if (this.props.teamsConfig.supportEmail && this.state.showSupportEmail) { - belowEmailSection = ( - <p className="mx_Login_support"> - Sorry, but your university is not registered with us just yet. - Email us on - <a href={"mailto:" + this.props.teamsConfig.supportEmail}> - { this.props.teamsConfig.supportEmail } - </a> - to get your university signed up. - Or continue to register with Riot to enjoy our open source platform. - </p> - ); - } else if (this.state.selectedTeam) { - belowEmailSection = ( - <p className="mx_Login_support"> - {_t("You are registering with %(SelectedTeamName)s", { - SelectedTeamName: this.state.selectedTeam.name, - })} - </p> - ); - } - } const CountryDropdown = sdk.getComponent('views.auth.CountryDropdown'); let phoneSection; @@ -369,7 +311,6 @@ module.exports = React.createClass({ <div> <form onSubmit={this.onSubmit}> { emailSection } - { belowEmailSection } { phoneSection } <input type="text" ref="username" placeholder={placeholderUserName} defaultValue={this.props.defaultUsername} diff --git a/src/components/views/dialogs/SetMxIdDialog.js b/src/components/views/dialogs/SetMxIdDialog.js index 222a2c35fe..6f11a28eae 100644 --- a/src/components/views/dialogs/SetMxIdDialog.js +++ b/src/components/views/dialogs/SetMxIdDialog.js @@ -193,9 +193,6 @@ export default React.createClass({ return; } - // XXX Implement RTS /register here - const teamToken = null; - this.props.onFinished(true, { userId: response.user_id, deviceId: response.device_id, @@ -203,7 +200,6 @@ export default React.createClass({ identityServerUrl: this._matrixClient.getIdentityServerUrl(), accessToken: response.access_token, password: this._generatedPassword, - teamToken: teamToken, }); }, diff --git a/src/index.js b/src/index.js index 8c290fcb64..7d0547d9c9 100644 --- a/src/index.js +++ b/src/index.js @@ -15,7 +15,6 @@ limitations under the License. */ import Skinner from './Skinner'; -import RtsClient from './RtsClient'; module.exports.loadSkin = function(skinObject) { Skinner.load(skinObject); @@ -28,7 +27,3 @@ module.exports.resetSkin = function() { module.exports.getComponent = function(componentName) { return Skinner.getComponent(componentName); }; - -module.exports.setFetch = function(fetchFunction) { - RtsClient.setFetch(fetchFunction); -}; diff --git a/test/components/structures/auth/Registration-test.js b/test/components/structures/auth/Registration-test.js deleted file mode 100644 index 8ce0301128..0000000000 --- a/test/components/structures/auth/Registration-test.js +++ /dev/null @@ -1,105 +0,0 @@ -/* -Copyright 2017 Vector Creations Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -const jest = require('jest-mock'); -const React = require('react'); -const ReactTestUtils = require('react-addons-test-utils'); -const expect = require('expect'); - -const testUtils = require('test-utils'); - -const sdk = require('matrix-react-sdk'); -const Registration = sdk.getComponent('structures.auth.Registration'); - -let rtsClient; -let client; - -const TEAM_CONFIG = { - supportEmail: 'support@some.domain', - teamServerURL: 'http://someteamserver.bla', -}; - -const CREDENTIALS = {userId: '@me:here'}; -const MOCK_REG_RESPONSE = { - user_id: CREDENTIALS.userId, - device_id: 'mydevice', - access_token: '2234569864534231', -}; - -describe('Registration', function() { - beforeEach(function() { - testUtils.beforeEach(this); - client = testUtils.createTestClient(); - client.credentials = CREDENTIALS; - - // Mock an RTS client that supports one team and naively returns team tokens when - // tracking by mapping email SIDs to team tokens. This is fine because we only - // want to assert the client behaviour such that a user recognised by the - // rtsClient (which would normally talk to the RTS server) as a team member is - // correctly logged in as one (and other such assertions). - rtsClient = testUtils.createTestRtsClient( - { - 'myawesometeam123': { - name: 'Team Awesome', - domain: 'team.awesome.net', - }, - }, - {'someEmailSid1234': 'myawesometeam123'}, - ); - }); - - it('should track a referral following successful registration of a team member', function(done) { - const expectedCreds = { - userId: MOCK_REG_RESPONSE.user_id, - deviceId: MOCK_REG_RESPONSE.device_id, - homeserverUrl: client.getHomeserverUrl(), - identityServerUrl: client.getIdentityServerUrl(), - accessToken: MOCK_REG_RESPONSE.access_token, - }; - const onLoggedIn = function(creds, teamToken) { - expect(creds).toEqual(expectedCreds); - expect(teamToken).toBe('myawesometeam123'); - done(); - }; - - const res = ReactTestUtils.renderIntoDocument( - <Registration - teamServerConfig={TEAM_CONFIG} - onLoggedIn={onLoggedIn} - rtsClient={rtsClient} - />, - ); - - res._onUIAuthFinished(true, MOCK_REG_RESPONSE, {emailSid: 'someEmailSid1234'}); - }); - - it('should NOT track a referral following successful registration of a non-team member', function(done) { - const onLoggedIn = jest.fn(function(creds, teamToken) { - expect(teamToken).toBeFalsy(); - done(); - }); - - const res = ReactTestUtils.renderIntoDocument( - <Registration - teamServerConfig={TEAM_CONFIG} - onLoggedIn={onLoggedIn} - rtsClient={rtsClient} - />, - ); - - res._onUIAuthFinished(true, MOCK_REG_RESPONSE, {emailSid: 'someOtherEmailSid11'}); - }); -}); diff --git a/test/components/views/auth/RegistrationForm-test.js b/test/components/views/auth/RegistrationForm-test.js deleted file mode 100644 index 4e7db9a230..0000000000 --- a/test/components/views/auth/RegistrationForm-test.js +++ /dev/null @@ -1,91 +0,0 @@ -/* -Copyright 2017 Vector Creations Ltd - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -const jest = require('jest-mock'); -const React = require('react'); -const ReactTestUtils = require('react-addons-test-utils'); -const expect = require('expect'); - -const testUtils = require('test-utils'); - -const sdk = require('matrix-react-sdk'); -const RegistrationForm = sdk.getComponent('views.auth.RegistrationForm'); - -const TEAM_CONFIG = { - supportEmail: "support@some.domain", - teams: [ - { name: "The Team Org.", domain: "team.ac.uk" }, - { name: "The Super Team", domain: "superteam.ac.uk" }, - ], -}; - -function doInputEmail(inputEmail, onTeamSelected) { - const res = ReactTestUtils.renderIntoDocument( - <RegistrationForm - teamsConfig={TEAM_CONFIG} - onTeamSelected={onTeamSelected} - flows={[ - { - stages: ['m.login.dummy'], - }, - ]} - />, - ); - - const teamInput = res.refs.email; - teamInput.value = inputEmail; - - ReactTestUtils.Simulate.change(teamInput); - ReactTestUtils.Simulate.blur(teamInput); - - return res; -} - -function expectTeamSelectedFromEmailInput(inputEmail, expectedTeam) { - const onTeamSelected = jest.fn(); - doInputEmail(inputEmail, onTeamSelected); - - expect(onTeamSelected).toHaveBeenCalledWith(expectedTeam); -} - -function expectSupportFromEmailInput(inputEmail, isSupportShown) { - const onTeamSelected = jest.fn(); - const res = doInputEmail(inputEmail, onTeamSelected); - - expect(res.state.showSupportEmail).toBe(isSupportShown); -} - -describe('RegistrationForm', function() { - beforeEach(function() { - testUtils.beforeEach(this); - }); - - it('should select a team when a team email is entered', function() { - expectTeamSelectedFromEmailInput("member@team.ac.uk", TEAM_CONFIG.teams[0]); - }); - - it('should not select a team when an unrecognised team email is entered', function() { - expectTeamSelectedFromEmailInput("member@someunknownteam.ac.uk", null); - }); - - it('should show support when an unrecognised team email is entered', function() { - expectSupportFromEmailInput("member@someunknownteam.ac.uk", true); - }); - - it('should NOT show support when an unrecognised non-team email is entered', function() { - expectSupportFromEmailInput("someone@yahoo.com", false); - }); -}); diff --git a/test/test-utils.js b/test/test-utils.js index d5bcd9397a..f4f00effbb 100644 --- a/test/test-utils.js +++ b/test/test-utils.js @@ -104,20 +104,6 @@ export function createTestClient() { }; } -export function createTestRtsClient(teamMap, sidMap) { - return { - getTeamsConfig() { - return Promise.resolve(Object.keys(teamMap).map((token) => teamMap[token])); - }, - trackReferral(referrer, emailSid, clientSecret) { - return Promise.resolve({team_token: sidMap[emailSid]}); - }, - getTeam(teamToken) { - return Promise.resolve(teamMap[teamToken]); - }, - }; -} - /** * Create an Event. * @param {Object} opts Values for the event.