Skip to content

Commit 753499e

Browse files
feedback
1 parent ea56d5c commit 753499e

2 files changed

Lines changed: 23 additions & 35 deletions

File tree

keeperapi/src/auth.ts

Lines changed: 13 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
LoginError,
88
TwoFactorChannelData
99
} from './configuration'
10-
import {KeeperEndpoint, KeeperEnvironment} from "./endpoint";
10+
import {KeeperEndpoint, KeeperEnvironment, ExecuteRestOptions} from "./endpoint";
1111
import {KeyWrapper, platform} from "./platform";
1212
import {
1313
generateEncryptionKey,
@@ -615,31 +615,23 @@ export class Auth {
615615
}
616616
}
617617

618-
async getSsoProvider(ssoDomain: string, locale?: string, ecOnly = false, blockRegionRedirect = false) {
618+
async getSsoProvider(ssoDomain: string, locale?: string, ecOnly = false, skipRegionRedirect = false) {
619619
let domainRequest: ISsoServiceProviderRequest = {
620620
name: ssoDomain.trim(),
621621
locale: locale,
622622
clientVersion: this.endpoint.clientVersion,
623623
}
624+
const domainResponse = await this.executeRest(ssoServiceProviderRequestMessage(domainRequest), { skipRegionRedirect })
625+
const params = domainResponse.isCloud
626+
? '?payload=' + await this._endpoint.prepareSsoPayload(this.messageSessionUid)
627+
: '?embedded&key=' + await this._endpoint.getOnsitePublicKey(ecOnly)
624628

625-
if (blockRegionRedirect) {
626-
this._endpoint.blockRegionRedirects = true
627-
}
628-
try {
629-
const domainResponse = await this.executeRest(ssoServiceProviderRequestMessage(domainRequest))
630-
const params = domainResponse.isCloud
631-
? '?payload=' + await this._endpoint.prepareSsoPayload(this.messageSessionUid)
632-
: '?embedded&key=' + await this._endpoint.getOnsitePublicKey(ecOnly)
633-
634-
this.userType = domainResponse.isCloud ? UserType.cloudSso : UserType.onsiteSso
635-
this.ssoLogoutUrl = domainResponse.spUrl.replace('login', 'logout')
629+
this.userType = domainResponse.isCloud ? UserType.cloudSso : UserType.onsiteSso
630+
this.ssoLogoutUrl = domainResponse.spUrl.replace('login', 'logout')
636631

637-
return {
638-
url: domainResponse.spUrl + params,
639-
name: domainResponse.name,
640-
}
641-
} finally {
642-
this._endpoint.blockRegionRedirects = false
632+
return {
633+
url: domainResponse.spUrl + params,
634+
name: domainResponse.name,
643635
}
644636
}
645637

@@ -1125,8 +1117,8 @@ export class Auth {
11251117
// return this.endpoint.executeV2Command(command);
11261118
// }
11271119

1128-
async executeRest<TIn, TOut>(message: RestOutMessage<TOut> | RestMessage<TIn, TOut>): Promise<TOut> {
1129-
return this.endpoint.executeRest(message, this._sessionToken);
1120+
async executeRest<TIn, TOut>(message: RestOutMessage<TOut> | RestMessage<TIn, TOut>, options?: ExecuteRestOptions): Promise<TOut> {
1121+
return this.endpoint.executeRest(message, this._sessionToken, options);
11301122
}
11311123

11321124
async executeRestCommand<Request, Response>(command: RestCommand<Request, Response>): Promise<Response> {

keeperapi/src/endpoint.ts

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@ import SsoCloudResponse = SsoCloud.SsoCloudResponse;
2929
import {KeeperHttpResponse, RestCommand} from './commands'
3030
import {AllowedEcKeyIds, AllowedMlKemKeyIds, isAllowedEcKeyId, isAllowedMlKemKeyId} from './transmissionKeys'
3131

32+
export type ExecuteRestOptions = {
33+
skipRegionRedirect?: boolean
34+
}
35+
3236
export class KeeperEndpoint {
3337
private _transmissionKey?: TransmissionKey
3438
private locale?: string
@@ -39,7 +43,6 @@ export class KeeperEndpoint {
3943
private onsitePublicKey: Uint8Array | null = null
4044

4145
private useHpkeForTransmissionKey: boolean = false
42-
blockRegionRedirects: boolean = false
4346

4447
constructor(private options: ClientConfigurationInternal) {
4548
if (options.deviceToken) {
@@ -155,16 +158,16 @@ export class KeeperEndpoint {
155158
}
156159
}
157160

158-
async executeRest<TIn, TOut>(message: RestOutMessage<TOut> | RestMessage<TIn, TOut>, sessionToken?: string): Promise<TOut> {
161+
async executeRest<TIn, TOut>(message: RestOutMessage<TOut> | RestMessage<TIn, TOut>, sessionToken?: string, options?: ExecuteRestOptions): Promise<TOut> {
159162
// @ts-ignore
160-
return this.executeRestInternal(message, sessionToken)
163+
return this.executeRestInternal(message, sessionToken, options)
161164
}
162165

163166
async executeRestAction<TIn>(message: RestInMessage<TIn> | RestActionMessage, sessionToken?: string): Promise<void> {
164167
return this.executeRestInternal(message, sessionToken)
165168
}
166169

167-
private async executeRestInternal<TIn, TOut>(message: RestInMessage<TIn> | RestOutMessage<TOut> | RestMessage<TIn, TOut> | RestActionMessage, sessionToken?: string): Promise<TOut | void> {
170+
private async executeRestInternal<TIn, TOut>(message: RestInMessage<TIn> | RestOutMessage<TOut> | RestMessage<TIn, TOut> | RestActionMessage, sessionToken?: string, options?: ExecuteRestOptions): Promise<TOut | void> {
168171
this._transmissionKey = await this.getTransmissionKey()
169172
while (true) {
170173
const payload = 'toBytes' in message ? message.toBytes() : new Uint8Array()
@@ -197,7 +200,6 @@ export class KeeperEndpoint {
197200
return
198201
} catch {
199202
const errorMessage = platform.bytesToString(response.data.slice(0, 1000))
200-
let blockedError: Error | undefined
201203
try {
202204
const errorObj: KeeperError = JSON.parse(errorMessage)
203205
switch (errorObj.error) {
@@ -235,13 +237,8 @@ export class KeeperEndpoint {
235237
await this.updateTransmissionKey(newEcKeyId, newMlKemKeyId)
236238
continue
237239
case 'region_redirect':
238-
if (this.blockRegionRedirects) {
239-
blockedError = new Error(JSON.stringify({
240-
error: 'region_redirect',
241-
region_host: errorObj.region_host,
242-
blocked: true,
243-
}))
244-
break
240+
if (options?.skipRegionRedirect) {
241+
throw new Error('region_redirect')
245242
}
246243
this.options.host = errorObj.region_host!
247244
if (this.options.onRegionChanged) {
@@ -260,12 +257,11 @@ export class KeeperEndpoint {
260257
}
261258
}
262259
}
263-
if (!blockedError && this.options.onCommandFailure) {
260+
if (this.options.onCommandFailure) {
264261
this.options.onCommandFailure({ ...errorObj, ...{ path: message.path } })
265262
}
266263
} catch {
267264
}
268-
if (blockedError) throw blockedError
269265
throw(new Error(errorMessage))
270266
}
271267
}

0 commit comments

Comments
 (0)