11/*
2- Copyright 2016 OpenMarket Ltd
3- Copyright 2019 The Matrix.org Foundation C.I.C.
2+ Copyright 2016, 2019, 2021 The Matrix.org Foundation C.I.C.
43
54Licensed under the Apache License, Version 2.0 (the "License");
65you may not use this file except in compliance with the License.
@@ -17,23 +16,26 @@ limitations under the License.
1716
1817import url from 'url' ;
1918import SettingsStore from "./settings/SettingsStore" ;
20- import { Service , startTermsFlow , TermsNotSignedError } from './Terms' ;
19+ import { Service , startTermsFlow , TermsInteractionCallback , TermsNotSignedError } from './Terms' ;
2120import { MatrixClientPeg } from "./MatrixClientPeg" ;
2221import request from "browser-request" ;
2322
2423import SdkConfig from "./SdkConfig" ;
2524import { WidgetType } from "./widgets/WidgetType" ;
2625import { SERVICE_TYPES } from "matrix-js-sdk/src/service-types" ;
26+ import { Room } from "matrix-js-sdk/src/models/room" ;
2727
2828// The version of the integration manager API we're intending to work with
2929const imApiVersion = "1.1" ;
3030
3131// TODO: Generify the name of this class and all components within - it's not just for Scalar.
3232
3333export default class ScalarAuthClient {
34- constructor ( apiUrl , uiUrl ) {
35- this . apiUrl = apiUrl ;
36- this . uiUrl = uiUrl ;
34+ private scalarToken : string ;
35+ private termsInteractionCallback : TermsInteractionCallback ;
36+ private isDefaultManager : boolean ;
37+
38+ constructor ( private apiUrl : string , private uiUrl : string ) {
3739 this . scalarToken = null ;
3840 // `undefined` to allow `startTermsFlow` to fallback to a default
3941 // callback if this is unset.
@@ -46,7 +48,7 @@ export default class ScalarAuthClient {
4648 this . isDefaultManager = apiUrl === configApiUrl && configUiUrl === uiUrl ;
4749 }
4850
49- _writeTokenToStore ( ) {
51+ private writeTokenToStore ( ) {
5052 window . localStorage . setItem ( "mx_scalar_token_at_" + this . apiUrl , this . scalarToken ) ;
5153 if ( this . isDefaultManager ) {
5254 // We remove the old token from storage to migrate upwards. This is safe
@@ -56,41 +58,41 @@ export default class ScalarAuthClient {
5658 }
5759 }
5860
59- _readTokenFromStore ( ) {
61+ private readTokenFromStore ( ) : string {
6062 let token = window . localStorage . getItem ( "mx_scalar_token_at_" + this . apiUrl ) ;
6163 if ( ! token && this . isDefaultManager ) {
6264 token = window . localStorage . getItem ( "mx_scalar_token" ) ;
6365 }
6466 return token ;
6567 }
6668
67- _readToken ( ) {
69+ private readToken ( ) : string {
6870 if ( this . scalarToken ) return this . scalarToken ;
69- return this . _readTokenFromStore ( ) ;
71+ return this . readTokenFromStore ( ) ;
7072 }
7173
7274 setTermsInteractionCallback ( callback ) {
7375 this . termsInteractionCallback = callback ;
7476 }
7577
76- connect ( ) {
78+ connect ( ) : Promise < void > {
7779 return this . getScalarToken ( ) . then ( ( tok ) => {
7880 this . scalarToken = tok ;
7981 } ) ;
8082 }
8183
82- hasCredentials ( ) {
84+ hasCredentials ( ) : boolean {
8385 return this . scalarToken != null ; // undef or null
8486 }
8587
8688 // Returns a promise that resolves to a scalar_token string
87- getScalarToken ( ) {
88- const token = this . _readToken ( ) ;
89+ getScalarToken ( ) : Promise < string > {
90+ const token = this . readToken ( ) ;
8991
9092 if ( ! token ) {
9193 return this . registerForToken ( ) ;
9294 } else {
93- return this . _checkToken ( token ) . catch ( ( e ) => {
95+ return this . checkToken ( token ) . catch ( ( e ) => {
9496 if ( e instanceof TermsNotSignedError ) {
9597 // retrying won't help this
9698 throw e ;
@@ -100,7 +102,7 @@ export default class ScalarAuthClient {
100102 }
101103 }
102104
103- _getAccountName ( token ) {
105+ private getAccountName ( token : string ) : Promise < string > {
104106 const url = this . apiUrl + "/account" ;
105107
106108 return new Promise ( function ( resolve , reject ) {
@@ -125,8 +127,8 @@ export default class ScalarAuthClient {
125127 } ) ;
126128 }
127129
128- _checkToken ( token ) {
129- return this . _getAccountName ( token ) . then ( userId => {
130+ private checkToken ( token : string ) : Promise < string > {
131+ return this . getAccountName ( token ) . then ( userId => {
130132 const me = MatrixClientPeg . get ( ) . getUserId ( ) ;
131133 if ( userId !== me ) {
132134 throw new Error ( "Scalar token is owned by someone else: " + me ) ;
@@ -154,7 +156,7 @@ export default class ScalarAuthClient {
154156 parsedImRestUrl . pathname = '' ;
155157 return startTermsFlow ( [ new Service (
156158 SERVICE_TYPES . IM ,
157- parsedImRestUrl . format ( ) ,
159+ url . format ( parsedImRestUrl ) ,
158160 token ,
159161 ) ] , this . termsInteractionCallback ) . then ( ( ) => {
160162 return token ;
@@ -165,22 +167,22 @@ export default class ScalarAuthClient {
165167 } ) ;
166168 }
167169
168- registerForToken ( ) {
170+ registerForToken ( ) : Promise < string > {
169171 // Get openid bearer token from the HS as the first part of our dance
170172 return MatrixClientPeg . get ( ) . getOpenIdToken ( ) . then ( ( tokenObject ) => {
171173 // Now we can send that to scalar and exchange it for a scalar token
172174 return this . exchangeForScalarToken ( tokenObject ) ;
173175 } ) . then ( ( token ) => {
174176 // Validate it (this mostly checks to see if the IM needs us to agree to some terms)
175- return this . _checkToken ( token ) ;
177+ return this . checkToken ( token ) ;
176178 } ) . then ( ( token ) => {
177179 this . scalarToken = token ;
178- this . _writeTokenToStore ( ) ;
180+ this . writeTokenToStore ( ) ;
179181 return token ;
180182 } ) ;
181183 }
182184
183- exchangeForScalarToken ( openidTokenObject ) {
185+ exchangeForScalarToken ( openidTokenObject : any ) : Promise < string > {
184186 const scalarRestUrl = this . apiUrl ;
185187
186188 return new Promise ( function ( resolve , reject ) {
@@ -194,7 +196,7 @@ export default class ScalarAuthClient {
194196 if ( err ) {
195197 reject ( err ) ;
196198 } else if ( response . statusCode / 100 !== 2 ) {
197- reject ( { statusCode : response . statusCode } ) ;
199+ reject ( new Error ( `Scalar request failed: ${ response . statusCode } ` ) ) ;
198200 } else if ( ! body || ! body . scalar_token ) {
199201 reject ( new Error ( "Missing scalar_token in response" ) ) ;
200202 } else {
@@ -204,7 +206,7 @@ export default class ScalarAuthClient {
204206 } ) ;
205207 }
206208
207- getScalarPageTitle ( url ) {
209+ getScalarPageTitle ( url : string ) : Promise < string > {
208210 let scalarPageLookupUrl = this . apiUrl + '/widgets/title_lookup' ;
209211 scalarPageLookupUrl = this . getStarterLink ( scalarPageLookupUrl ) ;
210212 scalarPageLookupUrl += '&curl=' + encodeURIComponent ( url ) ;
@@ -218,7 +220,7 @@ export default class ScalarAuthClient {
218220 if ( err ) {
219221 reject ( err ) ;
220222 } else if ( response . statusCode / 100 !== 2 ) {
221- reject ( { statusCode : response . statusCode } ) ;
223+ reject ( new Error ( `Scalar request failed: ${ response . statusCode } ` ) ) ;
222224 } else if ( ! body ) {
223225 reject ( new Error ( "Missing page title in response" ) ) ;
224226 } else {
@@ -240,10 +242,10 @@ export default class ScalarAuthClient {
240242 * @param {string } widgetId The widget ID to disable assets for
241243 * @return {Promise } Resolves on completion
242244 */
243- disableWidgetAssets ( widgetType : WidgetType , widgetId ) {
245+ disableWidgetAssets ( widgetType : WidgetType , widgetId : string ) : Promise < void > {
244246 let url = this . apiUrl + '/widgets/set_assets_state' ;
245247 url = this . getStarterLink ( url ) ;
246- return new Promise ( ( resolve , reject ) => {
248+ return new Promise < void > ( ( resolve , reject ) => {
247249 request ( {
248250 method : 'GET' , // XXX: Actions shouldn't be GET requests
249251 uri : url ,
@@ -257,7 +259,7 @@ export default class ScalarAuthClient {
257259 if ( err ) {
258260 reject ( err ) ;
259261 } else if ( response . statusCode / 100 !== 2 ) {
260- reject ( { statusCode : response . statusCode } ) ;
262+ reject ( new Error ( `Scalar request failed: ${ response . statusCode } ` ) ) ;
261263 } else if ( ! body ) {
262264 reject ( new Error ( "Failed to set widget assets state" ) ) ;
263265 } else {
@@ -267,7 +269,7 @@ export default class ScalarAuthClient {
267269 } ) ;
268270 }
269271
270- getScalarInterfaceUrlForRoom ( room , screen , id ) {
272+ getScalarInterfaceUrlForRoom ( room : Room , screen : string , id : string ) : string {
271273 const roomId = room . roomId ;
272274 const roomName = room . name ;
273275 let url = this . uiUrl ;
@@ -284,7 +286,7 @@ export default class ScalarAuthClient {
284286 return url ;
285287 }
286288
287- getStarterLink ( starterLinkUrl ) {
289+ getStarterLink ( starterLinkUrl : string ) : string {
288290 return starterLinkUrl + "?scalar_token=" + encodeURIComponent ( this . scalarToken ) ;
289291 }
290292}
0 commit comments