Skip to content
This repository was archived by the owner on Sep 11, 2024. It is now read-only.

Commit 02ff176

Browse files
committed
Ensure scalar_token is valid before opening integrations manager
Since Scalar (and other integration managers) are loaded as apps into an iframe, a valid `scalar_token` must exist when loading the app. It is possible that a scalar_token becomes invalid between the time when the integration manager button was rendered and the user clicking the link. Here we make a call to integration manager `/account` before trying to render the integration manager, which ensures we have a valid token for the integration manager to work with. Moving the scalar token revalidation to the cases where it is actually needed could make it possible to decrease the amount of Scalar /account calls we do when switching rooms, which is currently 3. Signed-off-by: Jason Robinson <jasonr@matrix.org>
1 parent a5c1d67 commit 02ff176

File tree

5 files changed

+46
-21
lines changed

5 files changed

+46
-21
lines changed

src/IntegrationManager.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@ export default class IntegrationManager {
5151
*/
5252
static async open(integName, integId, onFinished) {
5353
await IntegrationManager._init();
54+
if (global.mxIntegrationManager.client) {
55+
await global.mxIntegrationManager.client.connect();
56+
} else {
57+
return;
58+
}
5459
const IntegrationsManager = sdk.getComponent("views.settings.IntegrationsManager");
5560
if (global.mxIntegrationManager.error ||
5661
!(global.mxIntegrationManager.client && global.mxIntegrationManager.client.hasCredentials())) {

src/components/views/elements/AppTile.js

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -241,11 +241,18 @@ export default class AppTile extends React.Component {
241241
this.props.onEditClick();
242242
} else {
243243
const IntegrationsManager = sdk.getComponent("views.settings.IntegrationsManager");
244-
const src = this._scalarClient.getScalarInterfaceUrlForRoom(
245-
this.props.room, 'type_' + this.props.type, this.props.id);
246-
Modal.createTrackedDialog('Integrations Manager', '', IntegrationsManager, {
247-
src: src,
248-
}, "mx_IntegrationsManager");
244+
this._scalarClient.connect().done(() => {
245+
const src = this._scalarClient.getScalarInterfaceUrlForRoom(
246+
this.props.room, 'type_' + this.props.type, this.props.id);
247+
Modal.createTrackedDialog('Integrations Manager', '', IntegrationsManager, {
248+
src: src,
249+
}, "mx_IntegrationsManager");
250+
}, (err) => {
251+
this.setState({
252+
error: err.message,
253+
});
254+
console.error('Error ensuring a valid scalar_token exists', err);
255+
});
249256
}
250257
}
251258

src/components/views/elements/ManageIntegsButton.js

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ export default class ManageIntegsButton extends React.Component {
4545
this.scalarClient.connect().done(() => {
4646
this.forceUpdate();
4747
}, (err) => {
48-
this.setState({ scalarError: err});
48+
this.setState({scalarError: err});
4949
console.error('Error whilst initialising scalarClient for ManageIntegsButton', err);
5050
});
5151
}
@@ -61,11 +61,16 @@ export default class ManageIntegsButton extends React.Component {
6161
return;
6262
}
6363
const IntegrationsManager = sdk.getComponent("views.settings.IntegrationsManager");
64-
Modal.createDialog(IntegrationsManager, {
65-
src: (this.scalarClient !== null && this.scalarClient.hasCredentials()) ?
66-
this.scalarClient.getScalarInterfaceUrlForRoom(this.props.room) :
67-
null,
68-
}, "mx_IntegrationsManager");
64+
this.scalarClient.connect().done(() => {
65+
Modal.createDialog(IntegrationsManager, {
66+
src: (this.scalarClient !== null && this.scalarClient.hasCredentials()) ?
67+
this.scalarClient.getScalarInterfaceUrlForRoom(this.props.room) :
68+
null,
69+
}, "mx_IntegrationsManager");
70+
}, (err) => {
71+
this.setState({scalarError: err});
72+
console.error('Error ensuring a valid scalar_token exists', err);
73+
});
6974
}
7075

7176
render() {

src/components/views/rooms/AppsDrawer.js

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -144,12 +144,16 @@ module.exports = React.createClass({
144144

145145
_launchManageIntegrations: function() {
146146
const IntegrationsManager = sdk.getComponent('views.settings.IntegrationsManager');
147-
const src = (this.scalarClient !== null && this.scalarClient.hasCredentials()) ?
147+
this._scalarClient.connect().done(() => {
148+
const src = (this.scalarClient !== null && this.scalarClient.hasCredentials()) ?
148149
this.scalarClient.getScalarInterfaceUrlForRoom(this.props.room, 'add_integ') :
149150
null;
150-
Modal.createTrackedDialog('Integrations Manager', '', IntegrationsManager, {
151-
src: src,
152-
}, 'mx_IntegrationsManager');
151+
Modal.createTrackedDialog('Integrations Manager', '', IntegrationsManager, {
152+
src: src,
153+
}, 'mx_IntegrationsManager');
154+
}, (err) => {
155+
console.error('Error ensuring a valid scalar_token exists', err);
156+
});
153157
},
154158

155159
onClickAddWidget: function(e) {

src/components/views/rooms/Stickerpicker.js

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -310,18 +310,22 @@ export default class Stickerpicker extends React.Component {
310310
*/
311311
_launchManageIntegrations() {
312312
const IntegrationsManager = sdk.getComponent("views.settings.IntegrationsManager");
313-
const src = (this.scalarClient !== null && this.scalarClient.hasCredentials()) ?
313+
this.scalarClient.connect().done(() => {
314+
const src = (this.scalarClient !== null && this.scalarClient.hasCredentials()) ?
314315
this.scalarClient.getScalarInterfaceUrlForRoom(
315316
this.props.room,
316317
'type_' + widgetType,
317318
this.state.widgetId,
318319
) :
319320
null;
320-
Modal.createTrackedDialog('Integrations Manager', '', IntegrationsManager, {
321-
src: src,
322-
}, "mx_IntegrationsManager");
323-
324-
this.setState({showStickers: false});
321+
Modal.createTrackedDialog('Integrations Manager', '', IntegrationsManager, {
322+
src: src,
323+
}, "mx_IntegrationsManager");
324+
this.setState({showStickers: false});
325+
}, (err) => {
326+
this.setState({imError: err});
327+
console.error('Error ensuring a valid scalar_token exists', err);
328+
});
325329
}
326330

327331
render() {

0 commit comments

Comments
 (0)