diff --git a/src/WidgetUtils.js b/src/WidgetUtils.js index 5f45a8c58c..10cd473904 100644 --- a/src/WidgetUtils.js +++ b/src/WidgetUtils.js @@ -15,6 +15,8 @@ limitations under the License. */ import MatrixClientPeg from './MatrixClientPeg'; +import SdkConfig from "./SdkConfig"; +import * as url from "url"; export default class WidgetUtils { /* Returns true if user is able to send state events to modify widgets in this room @@ -55,4 +57,37 @@ export default class WidgetUtils { return room.currentState.maySendStateEvent('im.vector.modular.widgets', me); } + + /** + * Returns true if specified url is a scalar URL, typically https://scalar.vector.im/api + * @param {[type]} testUrlString URL to check + * @return {Boolean} True if specified URL is a scalar URL + */ + static isScalarUrl(testUrlString) { + if (!testUrlString) { + console.error('Scalar URL check failed. No URL specified'); + return false; + } + + const testUrl = url.parse(testUrlString); + + let scalarUrls = SdkConfig.get().integrations_widgets_urls; + if (!scalarUrls || scalarUrls.length === 0) { + scalarUrls = [SdkConfig.get().integrations_rest_url]; + } + + for (let i = 0; i < scalarUrls.length; i++) { + const scalarUrl = url.parse(scalarUrls[i]); + if (testUrl && scalarUrl) { + if ( + testUrl.protocol === scalarUrl.protocol && + testUrl.host === scalarUrl.host && + testUrl.pathname.startsWith(scalarUrl.pathname) + ) { + return true; + } + } + } + return false; + } } diff --git a/src/components/views/elements/AppPermission.js b/src/components/views/elements/AppPermission.js index c45006be3a..231ed52364 100644 --- a/src/components/views/elements/AppPermission.js +++ b/src/components/views/elements/AppPermission.js @@ -2,6 +2,7 @@ import React from 'react'; import PropTypes from 'prop-types'; import url from 'url'; import { _t } from '../../../languageHandler'; +import WidgetUtils from "../../../WidgetUtils"; export default class AppPermission extends React.Component { constructor(props) { @@ -19,7 +20,7 @@ export default class AppPermission extends React.Component { const searchParams = new URLSearchParams(wurl.search); - if (this.isScalarWurl(wurl) && searchParams && searchParams.get('url')) { + if (WidgetUtils.isScalarUrl(wurl) && searchParams && searchParams.get('url')) { curl = url.parse(searchParams.get('url')); if (curl) { curl.search = curl.query = ""; @@ -33,19 +34,6 @@ export default class AppPermission extends React.Component { return curlString; } - isScalarWurl(wurl) { - if (wurl && wurl.hostname && ( - wurl.hostname === 'scalar.vector.im' || - wurl.hostname === 'scalar-staging.riot.im' || - wurl.hostname === 'scalar-develop.riot.im' || - wurl.hostname === 'demo.riot.im' || - wurl.hostname === 'localhost' - )) { - return true; - } - return false; - } - render() { let e2eWarningText; if (this.props.isRoomEncrypted) { diff --git a/src/components/views/elements/AppTile.js b/src/components/views/elements/AppTile.js index 5f3ed6eba1..429b5941b9 100644 --- a/src/components/views/elements/AppTile.js +++ b/src/components/views/elements/AppTile.js @@ -25,7 +25,6 @@ import PlatformPeg from '../../../PlatformPeg'; import ScalarAuthClient from '../../../ScalarAuthClient'; import WidgetMessaging from '../../../WidgetMessaging'; import TintableSvgButton from './TintableSvgButton'; -import SdkConfig from '../../../SdkConfig'; import Modal from '../../../Modal'; import { _t, _td } from '../../../languageHandler'; import sdk from '../../../index'; @@ -121,39 +120,6 @@ export default class AppTile extends React.Component { return u.format(); } - /** - * Returns true if specified url is a scalar URL, typically https://scalar.vector.im/api - * @param {[type]} testUrlString URL to check - * @return {Boolean} True if specified URL is a scalar URL - */ - isScalarUrl(testUrlString) { - if (!testUrlString) { - console.error('Scalar URL check failed. No URL specified'); - return false; - } - - const testUrl = url.parse(testUrlString); - - let scalarUrls = SdkConfig.get().integrations_widgets_urls; - if (!scalarUrls || scalarUrls.length == 0) { - scalarUrls = [SdkConfig.get().integrations_rest_url]; - } - - for (let i = 0; i < scalarUrls.length; i++) { - const scalarUrl = url.parse(scalarUrls[i]); - if (testUrl && scalarUrl) { - if ( - testUrl.protocol === scalarUrl.protocol && - testUrl.host === scalarUrl.host && - testUrl.pathname.startsWith(scalarUrl.pathname) - ) { - return true; - } - } - } - return false; - } - isMixedContent() { const parentContentProtocol = window.location.protocol; const u = url.parse(this.props.url); @@ -209,7 +175,7 @@ export default class AppTile extends React.Component { setScalarToken() { this.setState({initialising: true}); - if (!this.isScalarUrl(this.props.url)) { + if (!WidgetUtils.isScalarUrl(this.props.url)) { console.warn('Non-scalar widget, not setting scalar token!', url); this.setState({ error: null,