bitwarden-estensione-browser/common/src/services/api.service.ts

1603 lines
74 KiB
TypeScript
Raw Normal View History

2018-06-13 20:08:43 +02:00
import { DeviceType } from '../enums/deviceType';
2020-01-20 14:54:51 +01:00
import { PolicyType } from '../enums/policyType';
2018-01-09 22:19:55 +01:00
import { ApiService as ApiServiceAbstraction } from '../abstractions/api.service';
import { PlatformUtilsService } from '../abstractions/platformUtils.service';
import { TokenService } from '../abstractions/token.service';
import { AttachmentRequest } from '../models/request/attachmentRequest';
2019-02-22 04:45:56 +01:00
import { BitPayInvoiceRequest } from '../models/request/bitPayInvoiceRequest';
2018-06-12 23:12:27 +02:00
import { CipherBulkDeleteRequest } from '../models/request/cipherBulkDeleteRequest';
import { CipherBulkMoveRequest } from '../models/request/cipherBulkMoveRequest';
2018-06-13 06:02:15 +02:00
import { CipherBulkShareRequest } from '../models/request/cipherBulkShareRequest';
2018-06-12 19:07:06 +02:00
import { CipherCollectionsRequest } from '../models/request/cipherCollectionsRequest';
2018-10-19 15:14:11 +02:00
import { CipherCreateRequest } from '../models/request/cipherCreateRequest';
import { CipherRequest } from '../models/request/cipherRequest';
2018-06-12 17:45:02 +02:00
import { CipherShareRequest } from '../models/request/cipherShareRequest';
2018-07-06 18:40:43 +02:00
import { CollectionRequest } from '../models/request/collectionRequest';
2018-07-13 21:55:02 +02:00
import { DeleteRecoverRequest } from '../models/request/deleteRecoverRequest';
import { EmailRequest } from '../models/request/emailRequest';
import { EmailTokenRequest } from '../models/request/emailTokenRequest';
import { EmergencyAccessAcceptRequest } from '../models/request/emergencyAccessAcceptRequest';
import { EmergencyAccessConfirmRequest } from '../models/request/emergencyAccessConfirmRequest';
import { EmergencyAccessInviteRequest } from '../models/request/emergencyAccessInviteRequest';
import { EmergencyAccessPasswordRequest } from '../models/request/emergencyAccessPasswordRequest';
import { EmergencyAccessUpdateRequest } from '../models/request/emergencyAccessUpdateRequest';
2019-06-20 14:56:45 +02:00
import { EventRequest } from '../models/request/eventRequest';
import { FolderRequest } from '../models/request/folderRequest';
2018-07-06 18:40:43 +02:00
import { GroupRequest } from '../models/request/groupRequest';
2019-09-19 14:52:57 +02:00
import { IapCheckRequest } from '../models/request/iapCheckRequest';
2018-06-23 21:41:22 +02:00
import { ImportCiphersRequest } from '../models/request/importCiphersRequest';
import { ImportDirectoryRequest } from '../models/request/importDirectoryRequest';
2018-06-23 21:41:22 +02:00
import { ImportOrganizationCiphersRequest } from '../models/request/importOrganizationCiphersRequest';
2018-08-28 01:55:05 +02:00
import { KdfRequest } from '../models/request/kdfRequest';
2018-07-03 18:06:01 +02:00
import { KeysRequest } from '../models/request/keysRequest';
2018-07-02 21:36:32 +02:00
import { OrganizationCreateRequest } from '../models/request/organizationCreateRequest';
import { OrganizationImportRequest } from '../models/request/organizationImportRequest';
import { OrganizationKeysRequest } from '../models/request/organizationKeysRequest';
2020-06-13 01:29:52 +02:00
import { OrganizationTaxInfoUpdateRequest } from '../models/request/organizationTaxInfoUpdateRequest';
2018-07-16 18:30:45 +02:00
import { OrganizationUpdateRequest } from '../models/request/organizationUpdateRequest';
2019-03-22 02:38:52 +01:00
import { OrganizationUpgradeRequest } from '../models/request/organizationUpgradeRequest';
2018-07-10 19:03:24 +02:00
import { OrganizationUserAcceptRequest } from '../models/request/organizationUserAcceptRequest';
import { OrganizationUserBulkConfirmRequest } from '../models/request/organizationUserBulkConfirmRequest';
import { OrganizationUserBulkRequest } from '../models/request/organizationUserBulkRequest';
2018-07-10 19:03:24 +02:00
import { OrganizationUserConfirmRequest } from '../models/request/organizationUserConfirmRequest';
import { OrganizationUserInviteRequest } from '../models/request/organizationUserInviteRequest';
import { OrganizationUserResetPasswordEnrollmentRequest } from '../models/request/organizationUserResetPasswordEnrollmentRequest';
import { OrganizationUserResetPasswordRequest } from '../models/request/organizationUserResetPasswordRequest';
2018-07-10 19:03:24 +02:00
import { OrganizationUserUpdateGroupsRequest } from '../models/request/organizationUserUpdateGroupsRequest';
import { OrganizationUserUpdateRequest } from '../models/request/organizationUserUpdateRequest';
import { PasswordHintRequest } from '../models/request/passwordHintRequest';
import { PasswordRequest } from '../models/request/passwordRequest';
2018-06-21 23:15:43 +02:00
import { PasswordVerificationRequest } from '../models/request/passwordVerificationRequest';
2018-06-30 19:22:21 +02:00
import { PaymentRequest } from '../models/request/paymentRequest';
2020-01-15 17:24:00 +01:00
import { PolicyRequest } from '../models/request/policyRequest';
2018-08-14 21:12:10 +02:00
import { PreloginRequest } from '../models/request/preloginRequest';
import { ProviderAddOrganizationRequest } from '../models/request/provider/providerAddOrganizationRequest';
import { ProviderOrganizationCreateRequest } from '../models/request/provider/providerOrganizationCreateRequest';
import { ProviderSetupRequest } from '../models/request/provider/providerSetupRequest';
import { ProviderUpdateRequest } from '../models/request/provider/providerUpdateRequest';
import { ProviderUserAcceptRequest } from '../models/request/provider/providerUserAcceptRequest';
import { ProviderUserBulkConfirmRequest } from '../models/request/provider/providerUserBulkConfirmRequest';
import { ProviderUserBulkRequest } from '../models/request/provider/providerUserBulkRequest';
import { ProviderUserConfirmRequest } from '../models/request/provider/providerUserConfirmRequest';
import { ProviderUserInviteRequest } from '../models/request/provider/providerUserInviteRequest';
import { ProviderUserUpdateRequest } from '../models/request/provider/providerUserUpdateRequest';
import { RegisterRequest } from '../models/request/registerRequest';
2018-07-17 18:05:19 +02:00
import { SeatRequest } from '../models/request/seatRequest';
2018-10-18 04:18:28 +02:00
import { SelectionReadOnlyRequest } from '../models/request/selectionReadOnlyRequest';
import { SendAccessRequest } from '../models/request/sendAccessRequest';
import { SendRequest } from '../models/request/sendRequest';
import { SetPasswordRequest } from '../models/request/setPasswordRequest';
2018-06-30 05:40:10 +02:00
import { StorageRequest } from '../models/request/storageRequest';
2020-06-13 01:29:52 +02:00
import { TaxInfoUpdateRequest } from '../models/request/taxInfoUpdateRequest';
import { TokenRequest } from '../models/request/tokenRequest';
import { TwoFactorEmailRequest } from '../models/request/twoFactorEmailRequest';
2018-06-26 21:17:14 +02:00
import { TwoFactorProviderRequest } from '../models/request/twoFactorProviderRequest';
import { TwoFactorRecoveryRequest } from '../models/request/twoFactorRecoveryRequest';
2018-06-26 05:04:59 +02:00
import { UpdateDomainsRequest } from '../models/request/updateDomainsRequest';
2018-07-17 23:22:45 +02:00
import { UpdateKeyRequest } from '../models/request/updateKeyRequest';
2018-06-21 05:40:59 +02:00
import { UpdateProfileRequest } from '../models/request/updateProfileRequest';
2018-06-26 21:17:14 +02:00
import { UpdateTwoFactorAuthenticatorRequest } from '../models/request/updateTwoFactorAuthenticatorRequest';
import { UpdateTwoFactorDuoRequest } from '../models/request/updateTwoFactorDuoRequest';
import { UpdateTwoFactorEmailRequest } from '../models/request/updateTwoFactorEmailRequest';
2021-03-15 16:16:51 +01:00
import { UpdateTwoFactorWebAuthnDeleteRequest } from '../models/request/updateTwoFactorWebAuthnDeleteRequest';
import { UpdateTwoFactorWebAuthnRequest } from '../models/request/updateTwoFactorWebAuthnRequest';
2018-06-26 21:17:14 +02:00
import { UpdateTwoFactorYubioOtpRequest } from '../models/request/updateTwoFactorYubioOtpRequest';
2018-07-17 17:04:19 +02:00
import { VerifyBankRequest } from '../models/request/verifyBankRequest';
2018-07-13 21:55:02 +02:00
import { VerifyDeleteRecoverRequest } from '../models/request/verifyDeleteRecoverRequest';
2018-07-12 17:35:04 +02:00
import { VerifyEmailRequest } from '../models/request/verifyEmailRequest';
import { Utils } from '../misc/utils';
2019-03-07 16:58:27 +01:00
import { ApiKeyResponse } from '../models/response/apiKeyResponse';
import { AttachmentResponse } from '../models/response/attachmentResponse';
import { AttachmentUploadDataResponse } from '../models/response/attachmentUploadDataResponse';
2018-06-29 17:29:24 +02:00
import { BillingResponse } from '../models/response/billingResponse';
2019-01-17 16:46:24 +01:00
import { BreachAccountResponse } from '../models/response/breachAccountResponse';
import { CipherResponse } from '../models/response/cipherResponse';
2018-07-06 18:40:43 +02:00
import {
CollectionGroupDetailsResponse,
CollectionResponse,
} from '../models/response/collectionResponse';
2018-06-26 05:04:59 +02:00
import { DomainsResponse } from '../models/response/domainsResponse';
import {
EmergencyAccessGranteeDetailsResponse,
EmergencyAccessGrantorDetailsResponse,
EmergencyAccessTakeoverResponse,
EmergencyAccessViewResponse
} from '../models/response/emergencyAccessResponse';
import { ErrorResponse } from '../models/response/errorResponse';
2018-07-07 05:06:38 +02:00
import { EventResponse } from '../models/response/eventResponse';
import { FolderResponse } from '../models/response/folderResponse';
2018-07-06 18:40:43 +02:00
import {
GroupDetailsResponse,
GroupResponse,
} from '../models/response/groupResponse';
import { IdentityTokenResponse } from '../models/response/identityTokenResponse';
import { IdentityTwoFactorResponse } from '../models/response/identityTwoFactorResponse';
2018-06-26 21:17:14 +02:00
import { ListResponse } from '../models/response/listResponse';
import { OrganizationKeysResponse } from '../models/response/organizationKeysResponse';
2018-07-02 21:36:32 +02:00
import { OrganizationResponse } from '../models/response/organizationResponse';
import { OrganizationSubscriptionResponse } from '../models/response/organizationSubscriptionResponse';
import { OrganizationUserBulkPublicKeyResponse } from '../models/response/organizationUserBulkPublicKeyResponse';
import { OrganizationUserBulkResponse } from '../models/response/organizationUserBulkResponse';
2018-07-10 19:03:24 +02:00
import {
OrganizationUserDetailsResponse,
OrganizationUserResetPasswordDetailsReponse,
2018-07-10 19:03:24 +02:00
OrganizationUserUserDetailsResponse,
} from '../models/response/organizationUserResponse';
2019-08-10 05:56:55 +02:00
import { PaymentResponse } from '../models/response/paymentResponse';
import { PlanResponse } from '../models/response/planResponse';
2020-01-15 17:24:00 +01:00
import { PolicyResponse } from '../models/response/policyResponse';
2018-08-14 21:12:10 +02:00
import { PreloginResponse } from '../models/response/preloginResponse';
2018-05-03 18:46:49 +02:00
import { ProfileResponse } from '../models/response/profileResponse';
import { ProviderOrganizationOrganizationDetailsResponse, ProviderOrganizationResponse } from '../models/response/provider/providerOrganizationResponse';
import { ProviderResponse } from '../models/response/provider/providerResponse';
import { ProviderUserBulkPublicKeyResponse } from '../models/response/provider/providerUserBulkPublicKeyResponse';
import { ProviderUserBulkResponse } from '../models/response/provider/providerUserBulkResponse';
import {
ProviderUserResponse,
ProviderUserUserDetailsResponse
} from '../models/response/provider/providerUserResponse';
2018-10-17 23:31:13 +02:00
import { SelectionReadOnlyResponse } from '../models/response/selectionReadOnlyResponse';
import { SendAccessResponse } from '../models/response/sendAccessResponse';
import { SendFileDownloadDataResponse } from '../models/response/sendFileDownloadDataResponse';
import { SendFileUploadDataResponse } from '../models/response/sendFileUploadDataResponse';
import { SendResponse } from '../models/response/sendResponse';
import { SubscriptionResponse } from '../models/response/subscriptionResponse';
import { SyncResponse } from '../models/response/syncResponse';
2020-06-13 01:29:52 +02:00
import { TaxInfoResponse } from '../models/response/taxInfoResponse';
import { TaxRateResponse } from '../models/response/taxRateResponse';
2018-06-26 21:17:14 +02:00
import { TwoFactorAuthenticatorResponse } from '../models/response/twoFactorAuthenticatorResponse';
import { TwoFactorDuoResponse } from '../models/response/twoFactorDuoResponse';
import { TwoFactorEmailResponse } from '../models/response/twoFactorEmailResponse';
import { TwoFactorProviderResponse } from '../models/response/twoFactorProviderResponse';
import { TwoFactorRecoverResponse } from '../models/response/twoFactorRescoverResponse';
2021-03-15 16:16:51 +01:00
import { TwoFactorWebAuthnResponse } from '../models/response/twoFactorWebAuthnResponse';
import { ChallengeResponse } from '../models/response/twoFactorWebAuthnResponse';
2018-06-26 21:17:14 +02:00
import { TwoFactorYubiKeyResponse } from '../models/response/twoFactorYubiKeyResponse';
2018-07-11 19:30:06 +02:00
import { UserKeyResponse } from '../models/response/userKeyResponse';
2018-01-09 22:19:55 +01:00
import { EnvironmentService } from '../abstractions';
import { IdentityCaptchaResponse } from '../models/response/identityCaptchaResponse';
import { SendAccessView } from '../models/view/sendAccessView';
2018-01-31 20:27:11 +01:00
export class ApiService implements ApiServiceAbstraction {
2019-08-22 18:04:15 +02:00
private device: DeviceType;
2018-06-14 04:09:47 +02:00
private deviceType: string;
private isWebClient = false;
private isDesktopClient = false;
2018-01-09 22:19:55 +01:00
2018-03-21 16:19:05 +01:00
constructor(private tokenService: TokenService, private platformUtilsService: PlatformUtilsService,
private environmentService: EnvironmentService, private logoutCallback: (expired: boolean) => Promise<void>,
private customUserAgent: string = null) {
2019-08-22 18:04:15 +02:00
this.device = platformUtilsService.getDevice();
this.deviceType = this.device.toString();
this.isWebClient = this.device === DeviceType.IEBrowser || this.device === DeviceType.ChromeBrowser ||
this.device === DeviceType.EdgeBrowser || this.device === DeviceType.FirefoxBrowser ||
this.device === DeviceType.OperaBrowser || this.device === DeviceType.SafariBrowser ||
this.device === DeviceType.UnknownBrowser || this.device === DeviceType.VivaldiBrowser;
this.isDesktopClient = this.device === DeviceType.WindowsDesktop || this.device === DeviceType.MacOsDesktop ||
this.device === DeviceType.LinuxDesktop;
2018-01-09 22:19:55 +01:00
}
// Auth APIs
async postIdentityToken(request: TokenRequest): Promise<IdentityTokenResponse | IdentityTwoFactorResponse | IdentityCaptchaResponse> {
2019-10-07 16:02:18 +02:00
const headers = new Headers({
'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
'Accept': 'application/json',
'Device-Type': this.deviceType,
});
if (this.customUserAgent != null) {
headers.set('User-Agent', this.customUserAgent);
}
2021-05-28 21:41:41 +02:00
request.alterIdentityTokenHeaders(headers);
const response = await this.fetch(new Request(this.environmentService.getIdentityUrl() + '/connect/token', {
body: this.qsStringify(request.toIdentityToken(request.clientId ?? this.platformUtilsService.identityClientId)),
2018-06-05 21:45:19 +02:00
credentials: this.getCredentials(),
2020-01-13 13:49:05 +01:00
cache: 'no-store',
2019-10-07 16:02:18 +02:00
headers: headers,
2018-01-09 22:19:55 +01:00
method: 'POST',
}));
let responseJson: any = null;
2019-04-10 21:39:36 +02:00
if (this.isJsonResponse(response)) {
2018-01-09 22:19:55 +01:00
responseJson = await response.json();
}
if (responseJson != null) {
if (response.status === 200) {
return new IdentityTokenResponse(responseJson);
} else if (response.status === 400 && responseJson.TwoFactorProviders2 &&
Object.keys(responseJson.TwoFactorProviders2).length) {
await this.tokenService.clearTwoFactorToken(request.email);
2018-02-02 04:55:49 +01:00
return new IdentityTwoFactorResponse(responseJson);
} else if (response.status === 400 && responseJson.HCaptcha_SiteKey &&
Object.keys(responseJson.HCaptcha_SiteKey).length) {
return new IdentityCaptchaResponse(responseJson);
2018-01-09 22:19:55 +01:00
}
}
return Promise.reject(new ErrorResponse(responseJson, response.status, true));
}
async refreshIdentityToken(): Promise<any> {
try {
await this.doRefreshToken();
} catch (e) {
return Promise.reject(null);
}
}
// Account APIs
2018-05-03 18:46:49 +02:00
async getProfile(): Promise<ProfileResponse> {
2018-06-26 04:42:57 +02:00
const r = await this.send('GET', '/accounts/profile', null, true, true);
return new ProfileResponse(r);
2018-05-03 18:46:49 +02:00
}
2018-06-29 17:29:24 +02:00
async getUserBilling(): Promise<BillingResponse> {
const r = await this.send('GET', '/accounts/billing', null, true, true);
return new BillingResponse(r);
}
async getUserSubscription(): Promise<SubscriptionResponse> {
const r = await this.send('GET', '/accounts/subscription', null, true, true);
return new SubscriptionResponse(r);
}
2020-06-13 01:29:52 +02:00
async getTaxInfo(): Promise<TaxInfoResponse> {
const r = await this.send('GET', '/accounts/tax', null, true, true);
return new TaxInfoResponse(r);
}
2018-06-21 05:40:59 +02:00
async putProfile(request: UpdateProfileRequest): Promise<ProfileResponse> {
2018-06-26 04:42:57 +02:00
const r = await this.send('PUT', '/accounts/profile', request, true, true);
return new ProfileResponse(r);
2018-06-21 05:40:59 +02:00
}
2020-06-13 01:29:52 +02:00
putTaxInfo(request: TaxInfoUpdateRequest): Promise<any> {
return this.send('PUT', '/accounts/tax', request, true, false);
}
2018-08-14 21:12:10 +02:00
async postPrelogin(request: PreloginRequest): Promise<PreloginResponse> {
const r = await this.send('POST', '/accounts/prelogin', request, false, true);
return new PreloginResponse(r);
}
2018-06-26 04:42:57 +02:00
postEmailToken(request: EmailTokenRequest): Promise<any> {
return this.send('POST', '/accounts/email-token', request, true, false);
}
2018-06-26 04:42:57 +02:00
postEmail(request: EmailRequest): Promise<any> {
return this.send('POST', '/accounts/email', request, true, false);
}
2018-06-26 04:42:57 +02:00
postPassword(request: PasswordRequest): Promise<any> {
return this.send('POST', '/accounts/password', request, true, false);
}
setPassword(request: SetPasswordRequest): Promise<any> {
return this.send('POST', '/accounts/set-password', request, true, false);
}
2018-06-26 04:42:57 +02:00
postSecurityStamp(request: PasswordVerificationRequest): Promise<any> {
return this.send('POST', '/accounts/security-stamp', request, true, false);
2018-06-21 23:15:43 +02:00
}
2018-07-16 23:16:15 +02:00
deleteAccount(request: PasswordVerificationRequest): Promise<any> {
2018-07-20 19:01:48 +02:00
return this.send('DELETE', '/accounts', request, true, false);
2018-06-21 23:15:43 +02:00
}
2018-01-09 22:19:55 +01:00
async getAccountRevisionDate(): Promise<number> {
2018-06-26 04:42:57 +02:00
const r = await this.send('GET', '/accounts/revision-date', null, true, true);
return r as number;
2018-01-09 22:19:55 +01:00
}
2018-06-26 04:42:57 +02:00
postPasswordHint(request: PasswordHintRequest): Promise<any> {
return this.send('POST', '/accounts/password-hint', request, false, false);
2018-01-09 22:19:55 +01:00
}
2018-06-26 04:42:57 +02:00
postRegister(request: RegisterRequest): Promise<any> {
return this.send('POST', '/accounts/register', request, false, false);
2018-01-09 22:19:55 +01:00
}
2019-08-10 05:56:55 +02:00
async postPremium(data: FormData): Promise<PaymentResponse> {
const r = await this.send('POST', '/accounts/premium', data, true, true);
return new PaymentResponse(r);
2018-06-29 19:58:01 +02:00
}
2019-09-19 14:52:57 +02:00
async postIapCheck(request: IapCheckRequest): Promise<any> {
return this.send('POST', '/accounts/iap-check', request, true, false);
}
2018-06-29 19:58:01 +02:00
postReinstatePremium(): Promise<any> {
return this.send('POST', '/accounts/reinstate-premium', null, true, false);
}
postCancelPremium(): Promise<any> {
return this.send('POST', '/accounts/cancel-premium', null, true, false);
2018-06-29 05:05:25 +02:00
}
async postAccountStorage(request: StorageRequest): Promise<PaymentResponse> {
const r = await this.send('POST', '/accounts/storage', request, true, true);
return new PaymentResponse(r);
2018-06-30 05:40:10 +02:00
}
2018-06-30 19:22:21 +02:00
postAccountPayment(request: PaymentRequest): Promise<any> {
return this.send('POST', '/accounts/payment', request, true, false);
}
2018-07-02 15:53:43 +02:00
postAccountLicense(data: FormData): Promise<any> {
return this.send('POST', '/accounts/license', data, true, false);
}
2018-07-03 18:06:01 +02:00
postAccountKeys(request: KeysRequest): Promise<any> {
return this.send('POST', '/accounts/keys', request, true, false);
}
2018-07-17 23:22:45 +02:00
postAccountKey(request: UpdateKeyRequest): Promise<any> {
return this.send('POST', '/accounts/key', request, true, false);
}
2018-07-12 17:35:04 +02:00
postAccountVerifyEmail(): Promise<any> {
return this.send('POST', '/accounts/verify-email', null, true, false);
}
postAccountVerifyEmailToken(request: VerifyEmailRequest): Promise<any> {
return this.send('POST', '/accounts/verify-email-token', request, false, false);
}
postAccountVerifyPassword(request: PasswordVerificationRequest): Promise<any> {
return this.send('POST', '/accounts/verify-password', request, true, false);
}
2018-07-13 21:55:02 +02:00
postAccountRecoverDelete(request: DeleteRecoverRequest): Promise<any> {
return this.send('POST', '/accounts/delete-recover', request, false, false);
}
postAccountRecoverDeleteToken(request: VerifyDeleteRecoverRequest): Promise<any> {
return this.send('POST', '/accounts/delete-recover-token', request, false, false);
}
2018-08-28 01:55:05 +02:00
postAccountKdf(request: KdfRequest): Promise<any> {
return this.send('POST', '/accounts/kdf', request, true, false);
}
async getEnterprisePortalSignInToken(): Promise<string> {
const r = await this.send('GET', '/accounts/enterprise-portal-signin-token', null, true, true);
return r as string;
}
async deleteSsoUser(organizationId: string): Promise<any> {
return this.send('DELETE', '/accounts/sso/' + organizationId, null, true, false);
}
async getSsoUserIdentifier(): Promise<string> {
2020-10-20 16:20:22 +02:00
return this.send('GET', '/accounts/sso/user-identifier', null, true, true);
}
async postUserApiKey(id: string, request: PasswordVerificationRequest): Promise<ApiKeyResponse> {
const r = await this.send('POST', '/accounts/api-key', request, true, true);
return new ApiKeyResponse(r);
}
async postUserRotateApiKey(id: string, request: PasswordVerificationRequest): Promise<ApiKeyResponse> {
const r = await this.send('POST', '/accounts/rotate-api-key', request, true, true);
return new ApiKeyResponse(r);
}
2018-01-09 22:19:55 +01:00
// Folder APIs
2018-08-20 22:01:26 +02:00
async getFolder(id: string): Promise<FolderResponse> {
const r = await this.send('GET', '/folders/' + id, null, true, true);
return new FolderResponse(r);
}
2018-01-09 22:19:55 +01:00
async postFolder(request: FolderRequest): Promise<FolderResponse> {
2018-06-26 04:42:57 +02:00
const r = await this.send('POST', '/folders', request, true, true);
return new FolderResponse(r);
2018-01-09 22:19:55 +01:00
}
async putFolder(id: string, request: FolderRequest): Promise<FolderResponse> {
2018-06-26 04:42:57 +02:00
const r = await this.send('PUT', '/folders/' + id, request, true, true);
return new FolderResponse(r);
2018-01-09 22:19:55 +01:00
}
2018-06-26 04:42:57 +02:00
deleteFolder(id: string): Promise<any> {
return this.send('DELETE', '/folders/' + id, null, true, false);
2018-01-09 22:19:55 +01:00
}
// Send APIs
async getSend(id: string): Promise<SendResponse> {
const r = await this.send('GET', '/sends/' + id, null, true, true);
return new SendResponse(r);
}
async postSendAccess(id: string, request: SendAccessRequest, apiUrl?: string): Promise<SendAccessResponse> {
const addSendIdHeader = (headers: Headers) => {
headers.set('Send-Id', id);
};
const r = await this.send('POST', '/sends/access/' + id, request, false, true, apiUrl, addSendIdHeader);
return new SendAccessResponse(r);
}
async getSendFileDownloadData(send: SendAccessView, request: SendAccessRequest, apiUrl?: string): Promise<SendFileDownloadDataResponse> {
const addSendIdHeader = (headers: Headers) => {
headers.set('Send-Id', send.id);
};
const r = await this.send('POST', '/sends/' + send.id + '/access/file/' + send.file.id, request, false, true,
apiUrl, addSendIdHeader);
return new SendFileDownloadDataResponse(r);
}
async getSends(): Promise<ListResponse<SendResponse>> {
const r = await this.send('GET', '/sends', null, true, true);
return new ListResponse(r, SendResponse);
}
async postSend(request: SendRequest): Promise<SendResponse> {
const r = await this.send('POST', '/sends', request, true, true);
return new SendResponse(r);
}
async postFileTypeSend(request: SendRequest): Promise<SendFileUploadDataResponse> {
const r = await this.send('POST', '/sends/file/v2', request, true, true);
return new SendFileUploadDataResponse(r);
}
async renewSendFileUploadUrl(sendId: string, fileId: string): Promise<SendFileUploadDataResponse> {
const r = await this.send('GET', '/sends/' + sendId + '/file/' + fileId, null, true, true);
return new SendFileUploadDataResponse(r);
}
postSendFile(sendId: string, fileId: string, data: FormData): Promise<any> {
return this.send('POST', '/sends/' + sendId + '/file/' + fileId, data, true, false);
}
/**
* @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.
* This method still exists for backward compatibility with old server versions.
*/
async postSendFileLegacy(data: FormData): Promise<SendResponse> {
const r = await this.send('POST', '/sends/file', data, true, true);
return new SendResponse(r);
}
async putSend(id: string, request: SendRequest): Promise<SendResponse> {
const r = await this.send('PUT', '/sends/' + id, request, true, true);
return new SendResponse(r);
}
async putSendRemovePassword(id: string): Promise<SendResponse> {
const r = await this.send('PUT', '/sends/' + id + '/remove-password', null, true, true);
return new SendResponse(r);
}
deleteSend(id: string): Promise<any> {
return this.send('DELETE', '/sends/' + id, null, true, false);
}
2018-01-09 22:19:55 +01:00
// Cipher APIs
2018-07-05 15:42:13 +02:00
async getCipher(id: string): Promise<CipherResponse> {
const r = await this.send('GET', '/ciphers/' + id, null, true, true);
return new CipherResponse(r);
}
async getCipherAdmin(id: string): Promise<CipherResponse> {
const r = await this.send('GET', '/ciphers/' + id + '/admin', null, true, true);
return new CipherResponse(r);
}
2018-07-04 05:33:15 +02:00
async getCiphersOrganization(organizationId: string): Promise<ListResponse<CipherResponse>> {
const r = await this.send('GET', '/ciphers/organization-details?organizationId=' + organizationId,
null, true, true);
return new ListResponse(r, CipherResponse);
}
2018-01-09 22:19:55 +01:00
async postCipher(request: CipherRequest): Promise<CipherResponse> {
2018-06-26 04:42:57 +02:00
const r = await this.send('POST', '/ciphers', request, true, true);
return new CipherResponse(r);
2018-01-09 22:19:55 +01:00
}
2018-10-19 15:14:11 +02:00
async postCipherCreate(request: CipherCreateRequest): Promise<CipherResponse> {
const r = await this.send('POST', '/ciphers/create', request, true, true);
return new CipherResponse(r);
}
async postCipherAdmin(request: CipherCreateRequest): Promise<CipherResponse> {
2018-07-05 15:42:13 +02:00
const r = await this.send('POST', '/ciphers/admin', request, true, true);
return new CipherResponse(r);
}
2018-01-09 22:19:55 +01:00
async putCipher(id: string, request: CipherRequest): Promise<CipherResponse> {
2018-06-26 04:42:57 +02:00
const r = await this.send('PUT', '/ciphers/' + id, request, true, true);
return new CipherResponse(r);
2018-01-09 22:19:55 +01:00
}
2018-07-05 15:42:13 +02:00
async putCipherAdmin(id: string, request: CipherRequest): Promise<CipherResponse> {
const r = await this.send('PUT', '/ciphers/' + id + '/admin', request, true, true);
return new CipherResponse(r);
}
2018-06-26 04:42:57 +02:00
deleteCipher(id: string): Promise<any> {
return this.send('DELETE', '/ciphers/' + id, null, true, false);
2018-06-12 19:07:06 +02:00
}
2018-07-05 15:42:13 +02:00
deleteCipherAdmin(id: string): Promise<any> {
return this.send('DELETE', '/ciphers/' + id + '/admin', null, true, false);
}
2018-06-26 04:42:57 +02:00
deleteManyCiphers(request: CipherBulkDeleteRequest): Promise<any> {
return this.send('DELETE', '/ciphers', request, true, false);
2018-06-12 23:12:27 +02:00
}
deleteManyCiphersAdmin(request: CipherBulkDeleteRequest): Promise<any> {
return this.send('DELETE', '/ciphers/admin', request, true, false);
}
2018-06-26 04:42:57 +02:00
putMoveCiphers(request: CipherBulkMoveRequest): Promise<any> {
return this.send('PUT', '/ciphers/move', request, true, false);
2018-06-12 23:12:27 +02:00
}
2018-10-23 22:16:59 +02:00
async putShareCipher(id: string, request: CipherShareRequest): Promise<CipherResponse> {
const r = await this.send('PUT', '/ciphers/' + id + '/share', request, true, true);
return new CipherResponse(r);
2018-06-13 06:02:15 +02:00
}
2018-06-26 04:42:57 +02:00
putShareCiphers(request: CipherBulkShareRequest): Promise<any> {
return this.send('PUT', '/ciphers/share', request, true, false);
2018-06-12 17:45:02 +02:00
}
2018-06-26 04:42:57 +02:00
putCipherCollections(id: string, request: CipherCollectionsRequest): Promise<any> {
return this.send('PUT', '/ciphers/' + id + '/collections', request, true, false);
2018-01-09 22:19:55 +01:00
}
2018-07-05 15:42:13 +02:00
putCipherCollectionsAdmin(id: string, request: CipherCollectionsRequest): Promise<any> {
return this.send('PUT', '/ciphers/' + id + '/collections-admin', request, true, false);
}
2018-09-25 15:12:11 +02:00
postPurgeCiphers(request: PasswordVerificationRequest, organizationId: string = null): Promise<any> {
let path = '/ciphers/purge';
if (organizationId != null) {
path += '?organizationId=' + organizationId;
}
return this.send('POST', path, request, true, false);
2018-06-23 21:41:22 +02:00
}
2018-06-26 04:42:57 +02:00
postImportCiphers(request: ImportCiphersRequest): Promise<any> {
return this.send('POST', '/ciphers/import', request, true, false);
2018-06-23 21:41:22 +02:00
}
postImportOrganizationCiphers(organizationId: string, request: ImportOrganizationCiphersRequest): Promise<any> {
return this.send('POST', '/ciphers/import-organization?organizationId=' + organizationId, request, true, false);
2018-06-21 23:15:43 +02:00
}
putDeleteCipher(id: string): Promise<any> {
return this.send('PUT', '/ciphers/' + id + '/delete', null, true, false);
}
putDeleteCipherAdmin(id: string): Promise<any> {
return this.send('PUT', '/ciphers/' + id + '/delete-admin', null, true, false);
}
putDeleteManyCiphers(request: CipherBulkDeleteRequest): Promise<any> {
return this.send('PUT', '/ciphers/delete', request, true, false);
}
putDeleteManyCiphersAdmin(request: CipherBulkDeleteRequest): Promise<any> {
return this.send('PUT', '/ciphers/delete-admin', request, true, false);
}
async putRestoreCipher(id: string): Promise<CipherResponse> {
const r = await this.send('PUT', '/ciphers/' + id + '/restore', null, true, true);
return new CipherResponse(r);
}
async putRestoreCipherAdmin(id: string): Promise<CipherResponse> {
const r = await this.send('PUT', '/ciphers/' + id + '/restore-admin', null, true, true);
return new CipherResponse(r);
}
async putRestoreManyCiphers(request: CipherBulkDeleteRequest): Promise<ListResponse<CipherResponse>> {
const r = await this.send('PUT', '/ciphers/restore', request, true, true);
return new ListResponse<CipherResponse>(r, CipherResponse);
}
2018-01-09 22:19:55 +01:00
// Attachments APIs
async getAttachmentData(cipherId: string, attachmentId: string, emergencyAccessId?: string): Promise<AttachmentResponse> {
const path = (emergencyAccessId != null ?
'/emergency-access/' + emergencyAccessId + '/' :
'/ciphers/') + cipherId + '/attachment/' + attachmentId;
const r = await this.send('GET', path, null, true, true);
return new AttachmentResponse(r);
}
async postCipherAttachment(id: string, request: AttachmentRequest): Promise<AttachmentUploadDataResponse> {
const r = await this.send('POST', '/ciphers/' + id + '/attachment/v2', request, true, true);
return new AttachmentUploadDataResponse(r);
}
/**
* @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.
* This method still exists for backward compatibility with old server versions.
*/
async postCipherAttachmentLegacy(id: string, data: FormData): Promise<CipherResponse> {
2018-06-26 04:42:57 +02:00
const r = await this.send('POST', '/ciphers/' + id + '/attachment', data, true, true);
return new CipherResponse(r);
2018-06-12 17:45:02 +02:00
}
/**
* @deprecated Mar 25 2021: This method has been deprecated in favor of direct uploads.
* This method still exists for backward compatibility with old server versions.
*/
async postCipherAttachmentAdminLegacy(id: string, data: FormData): Promise<CipherResponse> {
2018-07-05 15:42:13 +02:00
const r = await this.send('POST', '/ciphers/' + id + '/attachment-admin', data, true, true);
return new CipherResponse(r);
}
2018-06-26 04:42:57 +02:00
deleteCipherAttachment(id: string, attachmentId: string): Promise<any> {
return this.send('DELETE', '/ciphers/' + id + '/attachment/' + attachmentId, null, true, false);
2018-06-12 19:07:06 +02:00
}
2018-07-05 15:42:13 +02:00
deleteCipherAttachmentAdmin(id: string, attachmentId: string): Promise<any> {
return this.send('DELETE', '/ciphers/' + id + '/attachment/' + attachmentId + '/admin', null, true, false);
}
2018-06-26 04:42:57 +02:00
postShareCipherAttachment(id: string, attachmentId: string, data: FormData,
2018-06-12 17:45:02 +02:00
organizationId: string): Promise<any> {
2018-06-26 04:42:57 +02:00
return this.send('POST', '/ciphers/' + id + '/attachment/' +
attachmentId + '/share?organizationId=' + organizationId, data, true, false);
2018-01-09 22:19:55 +01:00
}
async renewAttachmentUploadUrl(id: string, attachmentId: string): Promise<AttachmentUploadDataResponse> {
const r = await this.send('GET', '/ciphers/' + id + '/attachment/' + attachmentId + '/renew', null, true, true);
return new AttachmentUploadDataResponse(r);
}
postAttachmentFile(id: string, attachmentId: string, data: FormData): Promise<any> {
2021-03-31 01:43:10 +02:00
return this.send('POST', '/ciphers/' + id + '/attachment/' + attachmentId, data, true, false);
}
2018-07-04 05:33:15 +02:00
// Collections APIs
2018-07-06 18:40:43 +02:00
async getCollectionDetails(organizationId: string, id: string): Promise<CollectionGroupDetailsResponse> {
const r = await this.send('GET', '/organizations/' + organizationId + '/collections/' + id + '/details',
null, true, true);
return new CollectionGroupDetailsResponse(r);
}
2018-10-17 17:18:12 +02:00
async getUserCollections(): Promise<ListResponse<CollectionResponse>> {
const r = await this.send('GET', '/collections', null, true, true);
return new ListResponse(r, CollectionResponse);
}
2018-07-04 05:33:15 +02:00
async getCollections(organizationId: string): Promise<ListResponse<CollectionResponse>> {
const r = await this.send('GET', '/organizations/' + organizationId + '/collections', null, true, true);
return new ListResponse(r, CollectionResponse);
}
2018-10-18 04:56:28 +02:00
async getCollectionUsers(organizationId: string, id: string): Promise<SelectionReadOnlyResponse[]> {
2018-07-06 18:40:43 +02:00
const r = await this.send('GET', '/organizations/' + organizationId + '/collections/' + id + '/users',
null, true, true);
2018-10-18 04:56:28 +02:00
return r.map((dr: any) => new SelectionReadOnlyResponse(dr));
2018-07-06 18:40:43 +02:00
}
2018-07-09 22:27:03 +02:00
async postCollection(organizationId: string, request: CollectionRequest): Promise<CollectionResponse> {
const r = await this.send('POST', '/organizations/' + organizationId + '/collections', request, true, true);
2018-07-06 18:40:43 +02:00
return new CollectionResponse(r);
}
2018-07-09 22:27:03 +02:00
async putCollection(organizationId: string, id: string, request: CollectionRequest): Promise<CollectionResponse> {
const r = await this.send('PUT', '/organizations/' + organizationId + '/collections/' + id,
request, true, true);
2018-07-06 18:40:43 +02:00
return new CollectionResponse(r);
}
2018-10-18 04:18:28 +02:00
async putCollectionUsers(organizationId: string, id: string, request: SelectionReadOnlyRequest[]): Promise<any> {
await this.send('PUT', '/organizations/' + organizationId + '/collections/' + id + '/users',
request, true, false);
}
2018-07-09 22:27:03 +02:00
deleteCollection(organizationId: string, id: string): Promise<any> {
return this.send('DELETE', '/organizations/' + organizationId + '/collections/' + id, null, true, false);
2018-07-06 18:40:43 +02:00
}
2018-07-10 05:47:12 +02:00
deleteCollectionUser(organizationId: string, id: string, organizationUserId: string): Promise<any> {
return this.send('DELETE',
'/organizations/' + organizationId + '/collections/' + id + '/user/' + organizationUserId,
null, true, false);
}
2018-07-06 18:40:43 +02:00
// Groups APIs
async getGroupDetails(organizationId: string, id: string): Promise<GroupDetailsResponse> {
const r = await this.send('GET', '/organizations/' + organizationId + '/groups/' + id + '/details',
null, true, true);
return new GroupDetailsResponse(r);
}
async getGroups(organizationId: string): Promise<ListResponse<GroupResponse>> {
const r = await this.send('GET', '/organizations/' + organizationId + '/groups', null, true, true);
return new ListResponse(r, GroupResponse);
}
2018-10-18 04:56:28 +02:00
async getGroupUsers(organizationId: string, id: string): Promise<string[]> {
2018-07-06 18:40:43 +02:00
const r = await this.send('GET', '/organizations/' + organizationId + '/groups/' + id + '/users',
null, true, true);
2018-10-18 04:56:28 +02:00
return r;
2018-07-06 18:40:43 +02:00
}
2018-07-09 22:27:03 +02:00
async postGroup(organizationId: string, request: GroupRequest): Promise<GroupResponse> {
const r = await this.send('POST', '/organizations/' + organizationId + '/groups', request, true, true);
2018-07-06 18:40:43 +02:00
return new GroupResponse(r);
}
2018-07-09 22:27:03 +02:00
async putGroup(organizationId: string, id: string, request: GroupRequest): Promise<GroupResponse> {
const r = await this.send('PUT', '/organizations/' + organizationId + '/groups/' + id, request, true, true);
2018-07-06 18:40:43 +02:00
return new GroupResponse(r);
}
2018-10-18 04:56:28 +02:00
async putGroupUsers(organizationId: string, id: string, request: string[]): Promise<any> {
await this.send('PUT', '/organizations/' + organizationId + '/groups/' + id + '/users', request, true, false);
}
2018-07-09 22:27:03 +02:00
deleteGroup(organizationId: string, id: string): Promise<any> {
return this.send('DELETE', '/organizations/' + organizationId + '/groups/' + id, null, true, false);
2018-07-06 18:40:43 +02:00
}
2018-07-10 05:47:12 +02:00
deleteGroupUser(organizationId: string, id: string, organizationUserId: string): Promise<any> {
return this.send('DELETE',
'/organizations/' + organizationId + '/groups/' + id + '/user/' + organizationUserId, null, true, false);
}
2020-01-15 17:24:00 +01:00
// Policy APIs
2020-01-20 14:54:51 +01:00
async getPolicy(organizationId: string, type: PolicyType): Promise<PolicyResponse> {
const r = await this.send('GET', '/organizations/' + organizationId + '/policies/' + type, null, true, true);
2020-01-15 17:24:00 +01:00
return new PolicyResponse(r);
}
async getPolicies(organizationId: string): Promise<ListResponse<PolicyResponse>> {
const r = await this.send('GET', '/organizations/' + organizationId + '/policies', null, true, true);
return new ListResponse(r, PolicyResponse);
}
async getPoliciesByToken(organizationId: string, token: string, email: string, organizationUserId: string):
Promise<ListResponse<PolicyResponse>> {
2020-03-02 17:37:44 +01:00
const r = await this.send('GET', '/organizations/' + organizationId + '/policies/token?' +
'token=' + encodeURIComponent(token) + '&email=' + encodeURIComponent(email) +
'&organizationUserId=' + organizationUserId, null, false, true);
return new ListResponse(r, PolicyResponse);
}
2020-01-20 14:54:51 +01:00
async putPolicy(organizationId: string, type: PolicyType, request: PolicyRequest): Promise<PolicyResponse> {
const r = await this.send('PUT', '/organizations/' + organizationId + '/policies/' + type, request, true, true);
2020-01-15 17:24:00 +01:00
return new PolicyResponse(r);
}
2018-07-06 21:00:55 +02:00
// Organization User APIs
2018-07-10 19:03:24 +02:00
async getOrganizationUser(organizationId: string, id: string): Promise<OrganizationUserDetailsResponse> {
const r = await this.send('GET', '/organizations/' + organizationId + '/users/' + id, null, true, true);
return new OrganizationUserDetailsResponse(r);
}
async getOrganizationUserGroups(organizationId: string, id: string): Promise<string[]> {
const r = await this.send('GET', '/organizations/' + organizationId + '/users/' + id + '/groups',
null, true, true);
return r;
}
2018-07-06 21:00:55 +02:00
async getOrganizationUsers(organizationId: string): Promise<ListResponse<OrganizationUserUserDetailsResponse>> {
const r = await this.send('GET', '/organizations/' + organizationId + '/users', null, true, true);
return new ListResponse(r, OrganizationUserUserDetailsResponse);
}
async getOrganizationUserResetPasswordDetails(organizationId: string, id: string):
Promise<OrganizationUserResetPasswordDetailsReponse> {
const r = await this.send('GET', '/organizations/' + organizationId + '/users/' + id +
'/reset-password-details', null, true, true);
return new OrganizationUserResetPasswordDetailsReponse(r);
}
2018-07-10 19:03:24 +02:00
postOrganizationUserInvite(organizationId: string, request: OrganizationUserInviteRequest): Promise<any> {
return this.send('POST', '/organizations/' + organizationId + '/users/invite', request, true, false);
}
postOrganizationUserReinvite(organizationId: string, id: string): Promise<any> {
return this.send('POST', '/organizations/' + organizationId + '/users/' + id + '/reinvite', null, true, false);
}
async postManyOrganizationUserReinvite(organizationId: string, request: OrganizationUserBulkRequest): Promise<ListResponse<OrganizationUserBulkResponse>> {
const r = await this.send('POST', '/organizations/' + organizationId + '/users/reinvite', request, true, true);
return new ListResponse(r, OrganizationUserBulkResponse);
2021-05-12 11:17:18 +02:00
}
2018-07-10 19:03:24 +02:00
postOrganizationUserAccept(organizationId: string, id: string,
request: OrganizationUserAcceptRequest): Promise<any> {
return this.send('POST', '/organizations/' + organizationId + '/users/' + id + '/accept', request, true, false);
}
postOrganizationUserConfirm(organizationId: string, id: string,
request: OrganizationUserConfirmRequest): Promise<any> {
return this.send('POST', '/organizations/' + organizationId + '/users/' + id + '/confirm',
request, true, false);
}
async postOrganizationUsersPublicKey(organizationId: string, request: OrganizationUserBulkRequest): Promise<ListResponse<OrganizationUserBulkPublicKeyResponse>> {
const r = await this.send('POST', '/organizations/' + organizationId + '/users/public-keys', request, true, true);
return new ListResponse(r, OrganizationUserBulkPublicKeyResponse);
}
async postOrganizationUserBulkConfirm(organizationId: string, request: OrganizationUserBulkConfirmRequest): Promise<ListResponse<OrganizationUserBulkResponse>> {
const r = await this.send('POST', '/organizations/' + organizationId + '/users/confirm', request, true, true);
return new ListResponse(r, OrganizationUserBulkResponse);
}
2018-07-10 19:03:24 +02:00
putOrganizationUser(organizationId: string, id: string, request: OrganizationUserUpdateRequest): Promise<any> {
return this.send('PUT', '/organizations/' + organizationId + '/users/' + id, request, true, false);
}
putOrganizationUserGroups(organizationId: string, id: string,
request: OrganizationUserUpdateGroupsRequest): Promise<any> {
return this.send('PUT', '/organizations/' + organizationId + '/users/' + id + '/groups', request, true, false);
}
putOrganizationUserResetPasswordEnrollment(organizationId: string, userId: string,
request: OrganizationUserResetPasswordEnrollmentRequest): Promise<any> {
return this.send('PUT', '/organizations/' + organizationId + '/users/' + userId + '/reset-password-enrollment',
request, true, false);
}
putOrganizationUserResetPassword(organizationId: string, id: string,
request: OrganizationUserResetPasswordRequest): Promise<any> {
return this.send('PUT', '/organizations/' + organizationId + '/users/' + id + '/reset-password',
request, true, false);
}
2018-07-10 19:03:24 +02:00
deleteOrganizationUser(organizationId: string, id: string): Promise<any> {
return this.send('DELETE', '/organizations/' + organizationId + '/users/' + id, null, true, false);
}
async deleteManyOrganizationUsers(organizationId: string, request: OrganizationUserBulkRequest): Promise<ListResponse<OrganizationUserBulkResponse>> {
const r = await this.send('DELETE', '/organizations/' + organizationId + '/users', request, true, true);
return new ListResponse(r, OrganizationUserBulkResponse);
}
// Plan APIs
async getPlans(): Promise<ListResponse<PlanResponse>> {
const r = await this.send('GET', '/plans/', null, true, true);
return new ListResponse(r, PlanResponse);
}
async postImportDirectory(organizationId: string, request: ImportDirectoryRequest): Promise<any> {
2018-06-26 04:42:57 +02:00
return this.send('POST', '/organizations/' + organizationId + '/import', request, true, false);
}
async postPublicImportDirectory(request: OrganizationImportRequest): Promise<any> {
return this.send('POST', '/public/organization/import', request, true, false);
}
async getTaxRates(): Promise<ListResponse<TaxRateResponse>> {
const r = await this.send('GET', '/plans/sales-tax-rates/', null, true, true);
return new ListResponse(r, TaxRateResponse);
}
2018-06-26 04:42:57 +02:00
2018-06-27 23:50:12 +02:00
// Settings APIs
2018-06-26 05:04:59 +02:00
async getSettingsDomains(): Promise<DomainsResponse> {
const r = await this.send('GET', '/settings/domains', null, true, true);
return new DomainsResponse(r);
}
async putSettingsDomains(request: UpdateDomainsRequest): Promise<DomainsResponse> {
const r = await this.send('PUT', '/settings/domains', request, true, true);
return new DomainsResponse(r);
}
// Sync APIs
async getSync(): Promise<SyncResponse> {
const path = this.isDesktopClient || this.isWebClient ? '/sync?excludeDomains=true' : '/sync';
const r = await this.send('GET', path, null, true, true);
return new SyncResponse(r);
}
2018-06-27 23:50:12 +02:00
// Two-factor APIs
2018-06-26 21:17:14 +02:00
async getTwoFactorProviders(): Promise<ListResponse<TwoFactorProviderResponse>> {
const r = await this.send('GET', '/two-factor', null, true, true);
return new ListResponse(r, TwoFactorProviderResponse);
}
2018-07-18 23:07:59 +02:00
async getTwoFactorOrganizationProviders(organizationId: string): Promise<ListResponse<TwoFactorProviderResponse>> {
const r = await this.send('GET', '/organizations/' + organizationId + '/two-factor', null, true, true);
return new ListResponse(r, TwoFactorProviderResponse);
}
2018-06-26 21:17:14 +02:00
async getTwoFactorAuthenticator(request: PasswordVerificationRequest): Promise<TwoFactorAuthenticatorResponse> {
const r = await this.send('POST', '/two-factor/get-authenticator', request, true, true);
return new TwoFactorAuthenticatorResponse(r);
}
async getTwoFactorEmail(request: PasswordVerificationRequest): Promise<TwoFactorEmailResponse> {
const r = await this.send('POST', '/two-factor/get-email', request, true, true);
return new TwoFactorEmailResponse(r);
}
async getTwoFactorDuo(request: PasswordVerificationRequest): Promise<TwoFactorDuoResponse> {
const r = await this.send('POST', '/two-factor/get-duo', request, true, true);
return new TwoFactorDuoResponse(r);
}
2018-07-18 23:07:59 +02:00
async getTwoFactorOrganizationDuo(organizationId: string,
request: PasswordVerificationRequest): Promise<TwoFactorDuoResponse> {
const r = await this.send('POST', '/organizations/' + organizationId + '/two-factor/get-duo',
request, true, true);
return new TwoFactorDuoResponse(r);
}
2018-06-26 21:17:14 +02:00
async getTwoFactorYubiKey(request: PasswordVerificationRequest): Promise<TwoFactorYubiKeyResponse> {
const r = await this.send('POST', '/two-factor/get-yubikey', request, true, true);
return new TwoFactorYubiKeyResponse(r);
}
2021-03-15 16:16:51 +01:00
async getTwoFactorWebAuthn(request: PasswordVerificationRequest): Promise<TwoFactorWebAuthnResponse> {
const r = await this.send('POST', '/two-factor/get-webauthn', request, true, true);
return new TwoFactorWebAuthnResponse(r);
2018-06-26 21:17:14 +02:00
}
2021-03-15 16:16:51 +01:00
async getTwoFactorWebAuthnChallenge(request: PasswordVerificationRequest): Promise<ChallengeResponse> {
const r = await this.send('POST', '/two-factor/get-webauthn-challenge', request, true, true);
2018-10-08 20:21:53 +02:00
return new ChallengeResponse(r);
}
2018-06-26 21:17:14 +02:00
async getTwoFactorRecover(request: PasswordVerificationRequest): Promise<TwoFactorRecoverResponse> {
const r = await this.send('POST', '/two-factor/get-recover', request, true, true);
return new TwoFactorRecoverResponse(r);
}
async putTwoFactorAuthenticator(
request: UpdateTwoFactorAuthenticatorRequest): Promise<TwoFactorAuthenticatorResponse> {
const r = await this.send('PUT', '/two-factor/authenticator', request, true, true);
return new TwoFactorAuthenticatorResponse(r);
}
async putTwoFactorEmail(request: UpdateTwoFactorEmailRequest): Promise<TwoFactorEmailResponse> {
const r = await this.send('PUT', '/two-factor/email', request, true, true);
return new TwoFactorEmailResponse(r);
}
async putTwoFactorDuo(request: UpdateTwoFactorDuoRequest): Promise<TwoFactorDuoResponse> {
const r = await this.send('PUT', '/two-factor/duo', request, true, true);
return new TwoFactorDuoResponse(r);
}
2018-07-18 23:07:59 +02:00
async putTwoFactorOrganizationDuo(organizationId: string,
request: UpdateTwoFactorDuoRequest): Promise<TwoFactorDuoResponse> {
const r = await this.send('PUT', '/organizations/' + organizationId + '/two-factor/duo', request, true, true);
return new TwoFactorDuoResponse(r);
}
2018-06-26 21:17:14 +02:00
async putTwoFactorYubiKey(request: UpdateTwoFactorYubioOtpRequest): Promise<TwoFactorYubiKeyResponse> {
const r = await this.send('PUT', '/two-factor/yubikey', request, true, true);
return new TwoFactorYubiKeyResponse(r);
}
2021-03-15 16:16:51 +01:00
async putTwoFactorWebAuthn(request: UpdateTwoFactorWebAuthnRequest): Promise<TwoFactorWebAuthnResponse> {
const response = request.deviceResponse.response as AuthenticatorAttestationResponse;
const data: any = Object.assign({}, request);
data.deviceResponse = {
id: request.deviceResponse.id,
rawId: btoa(request.deviceResponse.id),
type: request.deviceResponse.type,
extensions: request.deviceResponse.getClientExtensionResults(),
response: {
AttestationObject: Utils.fromBufferToB64(response.attestationObject),
clientDataJson: Utils.fromBufferToB64(response.clientDataJSON),
},
};
const r = await this.send('PUT', '/two-factor/webauthn', data, true, true);
return new TwoFactorWebAuthnResponse(r);
2018-06-26 21:17:14 +02:00
}
2021-03-15 16:16:51 +01:00
async deleteTwoFactorWebAuthn(request: UpdateTwoFactorWebAuthnDeleteRequest): Promise<TwoFactorWebAuthnResponse> {
const r = await this.send('DELETE', '/two-factor/webauthn', request, true, true);
return new TwoFactorWebAuthnResponse(r);
2018-10-08 20:21:53 +02:00
}
2018-06-26 21:17:14 +02:00
async putTwoFactorDisable(request: TwoFactorProviderRequest): Promise<TwoFactorProviderResponse> {
const r = await this.send('PUT', '/two-factor/disable', request, true, true);
return new TwoFactorProviderResponse(r);
2018-07-18 23:07:59 +02:00
}
async putTwoFactorOrganizationDisable(organizationId: string,
request: TwoFactorProviderRequest): Promise<TwoFactorProviderResponse> {
const r = await this.send('PUT', '/organizations/' + organizationId + '/two-factor/disable',
request, true, true);
return new TwoFactorProviderResponse(r);
2018-06-26 21:17:14 +02:00
}
postTwoFactorRecover(request: TwoFactorRecoveryRequest): Promise<any> {
return this.send('POST', '/two-factor/recover', request, false, false);
}
2018-06-27 23:50:12 +02:00
postTwoFactorEmailSetup(request: TwoFactorEmailRequest): Promise<any> {
return this.send('POST', '/two-factor/send-email', request, true, false);
}
postTwoFactorEmail(request: TwoFactorEmailRequest): Promise<any> {
return this.send('POST', '/two-factor/send-email-login', request, false, false);
}
// Emergency Access APIs
async getEmergencyAccessTrusted(): Promise<ListResponse<EmergencyAccessGranteeDetailsResponse>> {
const r = await this.send('GET', '/emergency-access/trusted', null, true, true);
return new ListResponse(r, EmergencyAccessGranteeDetailsResponse);
}
async getEmergencyAccessGranted(): Promise<ListResponse<EmergencyAccessGrantorDetailsResponse>> {
const r = await this.send('GET', '/emergency-access/granted', null, true, true);
return new ListResponse(r, EmergencyAccessGrantorDetailsResponse);
}
async getEmergencyAccess(id: string): Promise<EmergencyAccessGranteeDetailsResponse> {
const r = await this.send('GET', '/emergency-access/' + id, null, true, true);
return new EmergencyAccessGranteeDetailsResponse(r);
}
async getEmergencyGrantorPolicies(id: string): Promise<ListResponse<PolicyResponse>> {
const r = await this.send('GET', '/emergency-access/' + id + '/policies', null, true, true);
return new ListResponse(r, PolicyResponse);
}
putEmergencyAccess(id: string, request: EmergencyAccessUpdateRequest): Promise<any> {
return this.send('PUT', '/emergency-access/' + id, request, true, false);
}
deleteEmergencyAccess(id: string): Promise<any> {
return this.send('DELETE', '/emergency-access/' + id, null, true, false);
}
postEmergencyAccessInvite(request: EmergencyAccessInviteRequest): Promise<any> {
return this.send('POST', '/emergency-access/invite', request, true, false);
}
postEmergencyAccessReinvite(id: string): Promise<any> {
return this.send('POST', '/emergency-access/' + id + '/reinvite', null, true, false);
}
postEmergencyAccessAccept(id: string, request: EmergencyAccessAcceptRequest): Promise<any> {
return this.send('POST', '/emergency-access/' + id + '/accept', request, true, false);
}
postEmergencyAccessConfirm(id: string, request: EmergencyAccessConfirmRequest): Promise<any> {
return this.send('POST', '/emergency-access/' + id + '/confirm', request, true, false);
}
postEmergencyAccessInitiate(id: string): Promise<any> {
return this.send('POST', '/emergency-access/' + id + '/initiate', null, true, false);
}
postEmergencyAccessApprove(id: string): Promise<any> {
return this.send('POST', '/emergency-access/' + id + '/approve', null, true, false);
}
postEmergencyAccessReject(id: string): Promise<any> {
return this.send('POST', '/emergency-access/' + id + '/reject', null, true, false);
}
async postEmergencyAccessTakeover(id: string): Promise<EmergencyAccessTakeoverResponse> {
const r = await this.send('POST', '/emergency-access/' + id + '/takeover', null, true, true);
return new EmergencyAccessTakeoverResponse(r);
}
async postEmergencyAccessPassword(id: string, request: EmergencyAccessPasswordRequest): Promise<any> {
const r = await this.send('POST', '/emergency-access/' + id + '/password', request, true, true);
}
async postEmergencyAccessView(id: string): Promise<EmergencyAccessViewResponse> {
const r = await this.send('POST', '/emergency-access/' + id + '/view', null, true, true);
return new EmergencyAccessViewResponse(r);
}
2018-07-02 21:36:32 +02:00
// Organization APIs
2018-07-16 18:30:45 +02:00
async getOrganization(id: string): Promise<OrganizationResponse> {
const r = await this.send('GET', '/organizations/' + id, null, true, true);
return new OrganizationResponse(r);
}
async getOrganizationBilling(id: string): Promise<BillingResponse> {
2018-07-16 23:16:15 +02:00
const r = await this.send('GET', '/organizations/' + id + '/billing', null, true, true);
return new BillingResponse(r);
}
async getOrganizationSubscription(id: string): Promise<OrganizationSubscriptionResponse> {
const r = await this.send('GET', '/organizations/' + id + '/subscription', null, true, true);
return new OrganizationSubscriptionResponse(r);
2018-07-16 23:16:15 +02:00
}
2018-07-17 17:25:15 +02:00
async getOrganizationLicense(id: string, installationId: string): Promise<any> {
return this.send('GET', '/organizations/' + id + '/license?installationId=' + installationId,
null, true, true);
}
2020-06-13 01:29:52 +02:00
async getOrganizationTaxInfo(id: string): Promise<TaxInfoResponse> {
const r = await this.send('GET', '/organizations/' + id + '/tax', null, true, true);
return new TaxInfoResponse(r);
}
2018-07-02 21:36:32 +02:00
async postOrganization(request: OrganizationCreateRequest): Promise<OrganizationResponse> {
const r = await this.send('POST', '/organizations', request, true, true);
return new OrganizationResponse(r);
}
2018-07-16 18:30:45 +02:00
async putOrganization(id: string, request: OrganizationUpdateRequest): Promise<OrganizationResponse> {
const r = await this.send('PUT', '/organizations/' + id, request, true, true);
return new OrganizationResponse(r);
}
2020-06-13 01:29:52 +02:00
async putOrganizationTaxInfo(id: string, request: OrganizationTaxInfoUpdateRequest): Promise<any> {
return this.send('PUT', '/organizations/' + id + '/tax', request, true, false);
}
2018-07-04 15:54:14 +02:00
postLeaveOrganization(id: string): Promise<any> {
return this.send('POST', '/organizations/' + id + '/leave', null, true, false);
}
2018-07-02 21:36:32 +02:00
async postOrganizationLicense(data: FormData): Promise<OrganizationResponse> {
const r = await this.send('POST', '/organizations/license', data, true, true);
return new OrganizationResponse(r);
}
2018-07-18 04:50:04 +02:00
async postOrganizationLicenseUpdate(id: string, data: FormData): Promise<any> {
return this.send('POST', '/organizations/' + id + '/license', data, true, false);
}
2019-03-07 16:58:27 +01:00
async postOrganizationApiKey(id: string, request: PasswordVerificationRequest): Promise<ApiKeyResponse> {
const r = await this.send('POST', '/organizations/' + id + '/api-key', request, true, true);
return new ApiKeyResponse(r);
}
async postOrganizationRotateApiKey(id: string, request: PasswordVerificationRequest): Promise<ApiKeyResponse> {
const r = await this.send('POST', '/organizations/' + id + '/rotate-api-key', request, true, true);
return new ApiKeyResponse(r);
}
2019-08-10 05:56:55 +02:00
async postOrganizationUpgrade(id: string, request: OrganizationUpgradeRequest): Promise<PaymentResponse> {
const r = await this.send('POST', '/organizations/' + id + '/upgrade', request, true, true);
return new PaymentResponse(r);
2019-03-22 02:38:52 +01:00
}
2019-08-10 19:14:53 +02:00
async postOrganizationSeat(id: string, request: SeatRequest): Promise<PaymentResponse> {
const r = await this.send('POST', '/organizations/' + id + '/seat', request, true, true);
return new PaymentResponse(r);
2018-07-17 18:05:19 +02:00
}
async postOrganizationStorage(id: string, request: StorageRequest): Promise<PaymentResponse> {
const r = await this.send('POST', '/organizations/' + id + '/storage', request, true, true);
return new PaymentResponse(r);
2018-07-16 23:16:15 +02:00
}
postOrganizationPayment(id: string, request: PaymentRequest): Promise<any> {
return this.send('POST', '/organizations/' + id + '/payment', request, true, false);
}
2018-07-17 17:04:19 +02:00
postOrganizationVerifyBank(id: string, request: VerifyBankRequest): Promise<any> {
return this.send('POST', '/organizations/' + id + '/verify-bank', request, true, false);
}
postOrganizationCancel(id: string): Promise<any> {
return this.send('POST', '/organizations/' + id + '/cancel', null, true, false);
}
postOrganizationReinstate(id: string): Promise<any> {
return this.send('POST', '/organizations/' + id + '/reinstate', null, true, false);
}
2018-07-16 23:16:15 +02:00
deleteOrganization(id: string, request: PasswordVerificationRequest): Promise<any> {
return this.send('DELETE', '/organizations/' + id, request, true, false);
2018-07-16 18:30:45 +02:00
}
async getOrganizationKeys(id: string): Promise<OrganizationKeysResponse> {
const r = await this.send('GET', '/organizations/' + id + '/keys', null, true, true);
return new OrganizationKeysResponse(r);
}
async postOrganizationKeys(id: string, request: OrganizationKeysRequest): Promise<OrganizationKeysResponse> {
const r = await this.send('POST', '/organizations/' + id + '/keys', request, true, true);
return new OrganizationKeysResponse(r);
}
// Provider APIs
async postProviderSetup(id: string, request: ProviderSetupRequest) {
const r = await this.send('POST', '/providers/' + id + '/setup', request, true, true);
return new ProviderResponse(r);
}
async getProvider(id: string) {
const r = await this.send('GET', '/providers/' + id, null, true, true);
return new ProviderResponse(r);
}
async putProvider(id: string, request: ProviderUpdateRequest) {
const r = await this.send('PUT', '/providers/' + id, request, true, true);
return new ProviderResponse(r);
}
// Provider User APIs
async getProviderUsers(providerId: string): Promise<ListResponse<ProviderUserUserDetailsResponse>> {
const r = await this.send('GET', '/providers/' + providerId + '/users', null, true, true);
return new ListResponse(r, ProviderUserUserDetailsResponse);
}
async getProviderUser(providerId: string, id: string): Promise<ProviderUserResponse> {
const r = await this.send('GET', '/providers/' + providerId + '/users/' + id, null, true, true);
return new ProviderUserResponse(r);
}
postProviderUserInvite(providerId: string, request: ProviderUserInviteRequest): Promise<any> {
return this.send('POST', '/providers/' + providerId + '/users/invite', request, true, false);
}
postProviderUserReinvite(providerId: string, id: string): Promise<any> {
return this.send('POST', '/providers/' + providerId + '/users/' + id + '/reinvite', null, true, false);
}
async postManyProviderUserReinvite(providerId: string, request: ProviderUserBulkRequest): Promise<ListResponse<ProviderUserBulkResponse>> {
const r = await this.send('POST', '/providers/' + providerId + '/users/reinvite', request, true, true);
return new ListResponse(r, ProviderUserBulkResponse);
}
async postProviderUserBulkConfirm(providerId: string, request: ProviderUserBulkConfirmRequest): Promise<ListResponse<ProviderUserBulkResponse>> {
const r = await this.send('POST', '/providers/' + providerId + '/users/confirm', request, true, true);
return new ListResponse(r, ProviderUserBulkResponse);
}
async deleteManyProviderUsers(providerId: string, request: ProviderUserBulkRequest): Promise<ListResponse<ProviderUserBulkResponse>> {
const r = await this.send('DELETE', '/providers/' + providerId + '/users', request, true, true);
return new ListResponse(r, ProviderUserBulkResponse);
}
postProviderUserAccept(providerId: string, id: string, request: ProviderUserAcceptRequest): Promise<any> {
return this.send('POST', '/providers/' + providerId + '/users/' + id + '/accept', request, true, false);
}
postProviderUserConfirm(providerId: string, id: string, request: ProviderUserConfirmRequest): Promise<any> {
return this.send('POST', '/providers/' + providerId + '/users/' + id + '/confirm',
request, true, false);
}
async postProviderUsersPublicKey(providerId: string, request: ProviderUserBulkRequest): Promise<ListResponse<ProviderUserBulkPublicKeyResponse>> {
const r = await this.send('POST', '/providers/' + providerId + '/users/public-keys', request, true, true);
return new ListResponse(r, ProviderUserBulkPublicKeyResponse);
}
putProviderUser(providerId: string, id: string, request: ProviderUserUpdateRequest): Promise<any> {
return this.send('PUT', '/providers/' + providerId + '/users/' + id, request, true, false);
}
deleteProviderUser(providerId: string, id: string): Promise<any> {
return this.send('DELETE', '/providers/' + providerId + '/users/' + id, null, true, false);
}
// Provider Organization APIs
async getProviderClients(providerId: string): Promise<ListResponse<ProviderOrganizationOrganizationDetailsResponse>> {
const r = await this.send('GET', '/providers/' + providerId + '/organizations', null, true, true);
return new ListResponse(r, ProviderOrganizationOrganizationDetailsResponse);
}
postProviderAddOrganization(providerId: string, request: ProviderAddOrganizationRequest): Promise<any> {
return this.send('POST', '/providers/' + providerId + '/organizations/add', request, true, false);
}
async postProviderCreateOrganization(providerId: string, request: ProviderOrganizationCreateRequest): Promise<ProviderOrganizationResponse> {
const r = await this.send('POST', '/providers/' + providerId + '/organizations', request, true, true);
return new ProviderOrganizationResponse(r);
}
deleteProviderOrganization(providerId: string, id: string): Promise<any> {
return this.send('DELETE', '/providers/' + providerId + '/organizations/' + id, null, true, false);
}
2018-07-07 05:06:38 +02:00
// Event APIs
async getEvents(start: string, end: string, token: string): Promise<ListResponse<EventResponse>> {
const r = await this.send('GET', this.addEventParameters('/events', start, end, token), null, true, true);
return new ListResponse(r, EventResponse);
}
async getEventsCipher(id: string, start: string, end: string,
token: string): Promise<ListResponse<EventResponse>> {
const r = await this.send('GET', this.addEventParameters('/ciphers/' + id + '/events', start, end, token),
null, true, true);
return new ListResponse(r, EventResponse);
}
async getEventsOrganization(id: string, start: string, end: string,
token: string): Promise<ListResponse<EventResponse>> {
const r = await this.send('GET', this.addEventParameters('/organizations/' + id + '/events', start, end, token),
null, true, true);
return new ListResponse(r, EventResponse);
}
async getEventsOrganizationUser(organizationId: string, id: string,
start: string, end: string, token: string): Promise<ListResponse<EventResponse>> {
const r = await this.send('GET',
this.addEventParameters('/organizations/' + organizationId + '/users/' + id + '/events', start, end, token),
null, true, true);
return new ListResponse(r, EventResponse);
}
async getEventsProvider(id: string, start: string, end: string, token: string): Promise<ListResponse<EventResponse>> {
const r = await this.send('GET', this.addEventParameters('/providers/' + id + '/events', start, end, token), null, true, true);
return new ListResponse(r, EventResponse);
}
async getEventsProviderUser(providerId: string, id: string,
start: string, end: string, token: string): Promise<ListResponse<EventResponse>> {
const r = await this.send('GET',
this.addEventParameters('/providers/' + providerId + '/users/' + id + '/events', start, end, token),
null, true, true);
return new ListResponse(r, EventResponse);
}
2019-07-03 18:13:20 +02:00
async postEventsCollect(request: EventRequest[]): Promise<any> {
2019-06-20 14:56:45 +02:00
const authHeader = await this.getActiveBearerToken();
const headers = new Headers({
'Device-Type': this.deviceType,
'Authorization': 'Bearer ' + authHeader,
'Content-Type': 'application/json; charset=utf-8',
});
2019-10-07 16:02:18 +02:00
if (this.customUserAgent != null) {
headers.set('User-Agent', this.customUserAgent);
}
const response = await this.fetch(new Request(this.environmentService.getEventsUrl() + '/collect', {
2020-01-13 13:49:05 +01:00
cache: 'no-store',
2019-06-20 14:56:45 +02:00
credentials: this.getCredentials(),
method: 'POST',
body: JSON.stringify(request),
headers: headers,
}));
if (response.status !== 200) {
return Promise.reject('Event post failed.');
}
}
2018-07-11 19:30:06 +02:00
// User APIs
async getUserPublicKey(id: string): Promise<UserKeyResponse> {
const r = await this.send('GET', '/users/' + id + '/public-key', null, true, true);
return new UserKeyResponse(r);
}
2019-01-17 16:46:24 +01:00
// HIBP APIs
async getHibpBreach(username: string): Promise<BreachAccountResponse[]> {
const r = await this.send('GET', '/hibp/breach?username=' + username, null, true, true);
return r.map((a: any) => new BreachAccountResponse(a));
}
2019-02-22 04:45:56 +01:00
// Misc
async postBitPayInvoice(request: BitPayInvoiceRequest): Promise<string> {
const r = await this.send('POST', '/bitpay-invoice', request, true, true);
return r as string;
}
2019-08-10 05:56:55 +02:00
async postSetupPayment(): Promise<string> {
const r = await this.send('POST', '/setup-payment', null, true, true);
return r as string;
}
2018-06-26 04:42:57 +02:00
// Helpers
async getActiveBearerToken(): Promise<string> {
let accessToken = await this.tokenService.getToken();
if (this.tokenService.tokenNeedsRefresh()) {
await this.doRefreshToken();
accessToken = await this.tokenService.getToken();
}
return accessToken;
}
2018-07-08 05:48:58 +02:00
fetch(request: Request): Promise<Response> {
if (request.method === 'GET') {
2020-01-13 13:49:05 +01:00
request.headers.set('Cache-Control', 'no-store');
2018-07-08 05:48:58 +02:00
request.headers.set('Pragma', 'no-cache');
}
return this.nativeFetch(request);
}
nativeFetch(request: Request): Promise<Response> {
2018-07-08 05:48:58 +02:00
return fetch(request);
}
async preValidateSso(identifier: string): Promise<boolean> {
if (identifier == null || identifier === '') {
throw new Error('Organization Identifier was not provided.');
}
const headers = new Headers({
'Accept': 'application/json',
'Device-Type': this.deviceType,
});
if (this.customUserAgent != null) {
headers.set('User-Agent', this.customUserAgent);
}
const path = `/account/prevalidate?domainHint=${encodeURIComponent(identifier)}`;
const response = await this.fetch(new Request(this.environmentService.getIdentityUrl() + path, {
cache: 'no-store',
credentials: this.getCredentials(),
headers: headers,
method: 'GET',
}));
if (response.status === 200) {
return true;
} else {
const error = await this.handleError(response, false, true);
return Promise.reject(error);
}
}
protected async doRefreshToken(): Promise<void> {
const refreshToken = await this.tokenService.getRefreshToken();
if (refreshToken == null || refreshToken === '') {
throw new Error();
}
const headers = new Headers({
'Content-Type': 'application/x-www-form-urlencoded; charset=utf-8',
'Accept': 'application/json',
'Device-Type': this.deviceType,
});
if (this.customUserAgent != null) {
headers.set('User-Agent', this.customUserAgent);
}
const decodedToken = this.tokenService.decodeToken();
const response = await this.fetch(new Request(this.environmentService.getIdentityUrl() + '/connect/token', {
body: this.qsStringify({
grant_type: 'refresh_token',
client_id: decodedToken.client_id,
refresh_token: refreshToken,
}),
cache: 'no-store',
credentials: this.getCredentials(),
headers: headers,
method: 'POST',
}));
if (response.status === 200) {
const responseJson = await response.json();
const tokenResponse = new IdentityTokenResponse(responseJson);
await this.tokenService.setTokens(tokenResponse.accessToken, tokenResponse.refreshToken);
} else {
const error = await this.handleError(response, true, true);
return Promise.reject(error);
}
}
2018-06-26 04:42:57 +02:00
private async send(method: 'GET' | 'POST' | 'PUT' | 'DELETE', path: string, body: any,
authed: boolean, hasResponse: boolean, apiUrl?: string,
alterHeaders?: (headers: Headers) => void): Promise<any> {
apiUrl = Utils.isNullOrWhitespace(apiUrl) ? this.environmentService.getApiUrl() : apiUrl;
2018-06-26 04:42:57 +02:00
const headers = new Headers({
'Device-Type': this.deviceType,
});
2019-10-07 16:02:18 +02:00
if (this.customUserAgent != null) {
headers.set('User-Agent', this.customUserAgent);
}
2018-06-26 04:42:57 +02:00
const requestInit: RequestInit = {
2020-01-13 13:49:05 +01:00
cache: 'no-store',
2018-06-05 21:45:19 +02:00
credentials: this.getCredentials(),
2018-06-26 04:42:57 +02:00
method: method,
};
if (authed) {
const authHeader = await this.getActiveBearerToken();
headers.set('Authorization', 'Bearer ' + authHeader);
2018-06-26 04:42:57 +02:00
}
if (body != null) {
if (typeof body === 'string') {
requestInit.body = body;
headers.set('Content-Type', 'application/x-www-form-urlencoded; charset=utf-8');
} else if (typeof body === 'object') {
if (body instanceof FormData) {
requestInit.body = body;
} else {
headers.set('Content-Type', 'application/json; charset=utf-8');
requestInit.body = JSON.stringify(body);
}
}
}
if (hasResponse) {
headers.set('Accept', 'application/json');
}
if (alterHeaders != null) {
alterHeaders(headers);
}
2018-06-26 04:42:57 +02:00
requestInit.headers = headers;
const response = await this.fetch(new Request(apiUrl + path, requestInit));
2018-06-26 04:42:57 +02:00
if (hasResponse && response.status === 200) {
const responseJson = await response.json();
return responseJson;
} else if (response.status !== 200) {
const error = await this.handleError(response, false, authed);
return Promise.reject(error);
}
}
private async handleError(response: Response, tokenError: boolean, authed: boolean): Promise<ErrorResponse> {
if (authed && ((tokenError && response.status === 400) || response.status === 401 || response.status === 403)) {
2018-05-16 05:40:15 +02:00
await this.logoutCallback(true);
2018-01-09 22:19:55 +01:00
return null;
}
let responseJson: any = null;
2019-04-10 21:39:36 +02:00
if (this.isJsonResponse(response)) {
2018-01-09 22:19:55 +01:00
responseJson = await response.json();
} else if (this.isTextResponse(response)) {
responseJson = { Message: await response.text() };
2018-01-09 22:19:55 +01:00
}
return new ErrorResponse(responseJson, response.status, tokenError);
}
private qsStringify(params: any): string {
return Object.keys(params).map(key => {
2018-01-09 22:19:55 +01:00
return encodeURIComponent(key) + '=' + encodeURIComponent(params[key]);
}).join('&');
}
2018-06-05 21:45:19 +02:00
private getCredentials(): RequestCredentials {
if (!this.isWebClient || this.environmentService.hasBaseUrl()) {
2018-06-05 21:45:19 +02:00
return 'include';
}
return undefined;
}
2018-07-07 05:06:38 +02:00
private addEventParameters(base: string, start: string, end: string, token: string) {
if (start != null) {
base += ('?start=' + start);
}
if (end != null) {
base += (base.indexOf('?') > -1 ? '&' : '?');
base += ('end=' + end);
}
if (token != null) {
base += (base.indexOf('?') > -1 ? '&' : '?');
base += ('continuationToken=' + token);
}
return base;
}
2019-04-10 21:39:36 +02:00
private isJsonResponse(response: Response): boolean {
const typeHeader = response.headers.get('content-type');
return typeHeader != null && typeHeader.indexOf('application/json') > -1;
}
private isTextResponse(response: Response): boolean {
const typeHeader = response.headers.get('content-type');
return typeHeader != null && typeHeader.indexOf('text') > -1;
}
2018-01-09 22:19:55 +01:00
}