mirror of
https://github.com/bitwarden/browser
synced 2025-12-21 18:53:29 +00:00
convert request/response models to jslib
This commit is contained in:
@@ -1,14 +1,14 @@
|
||||
import { CipherString } from '../../models/domain/cipherString';
|
||||
import SymmetricCryptoKey from '../../models/domain/symmetricCryptoKey';
|
||||
|
||||
import { ProfileOrganizationResponse } from '../../models/response/profileOrganizationResponse';
|
||||
import { Response } from '@bitwarden/jslib';
|
||||
|
||||
export interface CryptoService {
|
||||
setKey(key: SymmetricCryptoKey): Promise<any>;
|
||||
setKeyHash(keyHash: string): Promise<{}>;
|
||||
setEncKey(encKey: string): Promise<{}>;
|
||||
setEncPrivateKey(encPrivateKey: string): Promise<{}>;
|
||||
setOrgKeys(orgs: ProfileOrganizationResponse[]): Promise<{}>;
|
||||
setOrgKeys(orgs: Response.ProfileOrganization[]): Promise<{}>;
|
||||
getKey(): Promise<SymmetricCryptoKey>;
|
||||
getKeyHash(): Promise<string>;
|
||||
getEncKey(): Promise<SymmetricCryptoKey>;
|
||||
|
||||
@@ -2,33 +2,10 @@ import AppIdService from './appId.service';
|
||||
import ConstantsService from './constants.service';
|
||||
import TokenService from './token.service';
|
||||
|
||||
import { Abstractions } from '@bitwarden/jslib';
|
||||
import { Abstractions, Request as Req, Response as Res } from '@bitwarden/jslib';
|
||||
|
||||
import EnvironmentUrls from '../models/domain/environmentUrls';
|
||||
|
||||
import { CipherRequest } from '../models/request/cipherRequest';
|
||||
import { DeviceRequest } from '../models/request/deviceRequest';
|
||||
import { DeviceTokenRequest } from '../models/request/deviceTokenRequest';
|
||||
import { FolderRequest } from '../models/request/folderRequest';
|
||||
import { PasswordHintRequest } from '../models/request/passwordHintRequest';
|
||||
import { RegisterRequest } from '../models/request/registerRequest';
|
||||
import { TokenRequest } from '../models/request/tokenRequest';
|
||||
import { TwoFactorEmailRequest } from '../models/request/twoFactorEmailRequest';
|
||||
|
||||
import { AttachmentResponse } from '../models/response/attachmentResponse';
|
||||
import { CipherResponse } from '../models/response/cipherResponse';
|
||||
import { DeviceResponse } from '../models/response/deviceResponse';
|
||||
import { DomainsResponse } from '../models/response/domainsResponse';
|
||||
import { ErrorResponse } from '../models/response/errorResponse';
|
||||
import { FolderResponse } from '../models/response/folderResponse';
|
||||
import { GlobalDomainResponse } from '../models/response/globalDomainResponse';
|
||||
import { IdentityTokenResponse } from '../models/response/identityTokenResponse';
|
||||
import { KeysResponse } from '../models/response/keysResponse';
|
||||
import { ListResponse } from '../models/response/listResponse';
|
||||
import { ProfileOrganizationResponse } from '../models/response/profileOrganizationResponse';
|
||||
import { ProfileResponse } from '../models/response/profileResponse';
|
||||
import { SyncResponse } from '../models/response/syncResponse';
|
||||
|
||||
export default class ApiService {
|
||||
urlsSet: boolean = false;
|
||||
baseUrl: string;
|
||||
@@ -82,7 +59,7 @@ export default class ApiService {
|
||||
|
||||
// Auth APIs
|
||||
|
||||
async postIdentityToken(request: TokenRequest): Promise<IdentityTokenResponse | any> {
|
||||
async postIdentityToken(request: Req.Token): Promise<Res.IdentityToken | any> {
|
||||
const response = await fetch(new Request(this.identityBaseUrl + '/connect/token', {
|
||||
body: this.qsStringify(request.toIdentityToken()),
|
||||
cache: 'no-cache',
|
||||
@@ -102,7 +79,7 @@ export default class ApiService {
|
||||
|
||||
if (responseJson != null) {
|
||||
if (response.status === 200) {
|
||||
return new IdentityTokenResponse(responseJson);
|
||||
return new Res.IdentityToken(responseJson);
|
||||
} else if (response.status === 400 && responseJson.TwoFactorProviders2 &&
|
||||
Object.keys(responseJson.TwoFactorProviders2).length) {
|
||||
await this.tokenService.clearTwoFactorToken(request.email);
|
||||
@@ -110,7 +87,7 @@ export default class ApiService {
|
||||
}
|
||||
}
|
||||
|
||||
return Promise.reject(new ErrorResponse(responseJson, response.status, true));
|
||||
return Promise.reject(new Res.Error(responseJson, response.status, true));
|
||||
}
|
||||
|
||||
async refreshIdentityToken(): Promise<any> {
|
||||
@@ -123,7 +100,7 @@ export default class ApiService {
|
||||
|
||||
// Two Factor APIs
|
||||
|
||||
async postTwoFactorEmail(request: TwoFactorEmailRequest): Promise<any> {
|
||||
async postTwoFactorEmail(request: Req.TwoFactorEmail): Promise<any> {
|
||||
const response = await fetch(new Request(this.baseUrl + '/two-factor/send-email-login', {
|
||||
body: JSON.stringify(request),
|
||||
cache: 'no-cache',
|
||||
@@ -161,7 +138,7 @@ export default class ApiService {
|
||||
}
|
||||
}
|
||||
|
||||
async postPasswordHint(request: PasswordHintRequest): Promise<any> {
|
||||
async postPasswordHint(request: Req.PasswordHint): Promise<any> {
|
||||
const response = await fetch(new Request(this.baseUrl + '/accounts/password-hint', {
|
||||
body: JSON.stringify(request),
|
||||
cache: 'no-cache',
|
||||
@@ -178,7 +155,7 @@ export default class ApiService {
|
||||
}
|
||||
}
|
||||
|
||||
async postRegister(request: RegisterRequest): Promise<any> {
|
||||
async postRegister(request: Req.Register): Promise<any> {
|
||||
const response = await fetch(new Request(this.baseUrl + '/accounts/register', {
|
||||
body: JSON.stringify(request),
|
||||
cache: 'no-cache',
|
||||
@@ -197,7 +174,7 @@ export default class ApiService {
|
||||
|
||||
// Folder APIs
|
||||
|
||||
async postFolder(request: FolderRequest): Promise<FolderResponse> {
|
||||
async postFolder(request: Req.Folder): Promise<Res.Folder> {
|
||||
const authHeader = await this.handleTokenState();
|
||||
const response = await fetch(new Request(this.baseUrl + '/folders', {
|
||||
body: JSON.stringify(request),
|
||||
@@ -213,14 +190,14 @@ export default class ApiService {
|
||||
|
||||
if (response.status === 200) {
|
||||
const responseJson = await response.json();
|
||||
return new FolderResponse(responseJson);
|
||||
return new Res.Folder(responseJson);
|
||||
} else {
|
||||
const error = await this.handleError(response, false);
|
||||
return Promise.reject(error);
|
||||
}
|
||||
}
|
||||
|
||||
async putFolder(id: string, request: FolderRequest): Promise<FolderResponse> {
|
||||
async putFolder(id: string, request: Req.Folder): Promise<Res.Folder> {
|
||||
const authHeader = await this.handleTokenState();
|
||||
const response = await fetch(new Request(this.baseUrl + '/folders/' + id, {
|
||||
body: JSON.stringify(request),
|
||||
@@ -236,7 +213,7 @@ export default class ApiService {
|
||||
|
||||
if (response.status === 200) {
|
||||
const responseJson = await response.json();
|
||||
return new FolderResponse(responseJson);
|
||||
return new Res.Folder(responseJson);
|
||||
} else {
|
||||
const error = await this.handleError(response, false);
|
||||
return Promise.reject(error);
|
||||
@@ -262,7 +239,7 @@ export default class ApiService {
|
||||
|
||||
// Cipher APIs
|
||||
|
||||
async postCipher(request: CipherRequest): Promise<CipherResponse> {
|
||||
async postCipher(request: Req.Cipher): Promise<Res.Cipher> {
|
||||
const authHeader = await this.handleTokenState();
|
||||
const response = await fetch(new Request(this.baseUrl + '/ciphers', {
|
||||
body: JSON.stringify(request),
|
||||
@@ -278,14 +255,14 @@ export default class ApiService {
|
||||
|
||||
if (response.status === 200) {
|
||||
const responseJson = await response.json();
|
||||
return new CipherResponse(responseJson);
|
||||
return new Res.Cipher(responseJson);
|
||||
} else {
|
||||
const error = await this.handleError(response, false);
|
||||
return Promise.reject(error);
|
||||
}
|
||||
}
|
||||
|
||||
async putCipher(id: string, request: CipherRequest): Promise<CipherResponse> {
|
||||
async putCipher(id: string, request: Req.Cipher): Promise<Res.Cipher> {
|
||||
const authHeader = await this.handleTokenState();
|
||||
const response = await fetch(new Request(this.baseUrl + '/ciphers/' + id, {
|
||||
body: JSON.stringify(request),
|
||||
@@ -301,7 +278,7 @@ export default class ApiService {
|
||||
|
||||
if (response.status === 200) {
|
||||
const responseJson = await response.json();
|
||||
return new CipherResponse(responseJson);
|
||||
return new Res.Cipher(responseJson);
|
||||
} else {
|
||||
const error = await this.handleError(response, false);
|
||||
return Promise.reject(error);
|
||||
@@ -327,7 +304,7 @@ export default class ApiService {
|
||||
|
||||
// Attachments APIs
|
||||
|
||||
async postCipherAttachment(id: string, data: FormData): Promise<CipherResponse> {
|
||||
async postCipherAttachment(id: string, data: FormData): Promise<Res.Cipher> {
|
||||
const authHeader = await this.handleTokenState();
|
||||
const response = await fetch(new Request(this.baseUrl + '/ciphers/' + id + '/attachment', {
|
||||
body: data,
|
||||
@@ -342,7 +319,7 @@ export default class ApiService {
|
||||
|
||||
if (response.status === 200) {
|
||||
const responseJson = await response.json();
|
||||
return new CipherResponse(responseJson);
|
||||
return new Res.Cipher(responseJson);
|
||||
} else {
|
||||
const error = await this.handleError(response, false);
|
||||
return Promise.reject(error);
|
||||
@@ -368,7 +345,7 @@ export default class ApiService {
|
||||
|
||||
// Sync APIs
|
||||
|
||||
async getSync(): Promise<SyncResponse> {
|
||||
async getSync(): Promise<Res.Sync> {
|
||||
const authHeader = await this.handleTokenState();
|
||||
const response = await fetch(new Request(this.baseUrl + '/sync', {
|
||||
cache: 'no-cache',
|
||||
@@ -381,7 +358,7 @@ export default class ApiService {
|
||||
|
||||
if (response.status === 200) {
|
||||
const responseJson = await response.json();
|
||||
return new SyncResponse(responseJson);
|
||||
return new Res.Sync(responseJson);
|
||||
} else {
|
||||
const error = await this.handleError(response, false);
|
||||
return Promise.reject(error);
|
||||
@@ -390,7 +367,7 @@ export default class ApiService {
|
||||
|
||||
// Helpers
|
||||
|
||||
private async handleError(response: Response, tokenError: boolean): Promise<ErrorResponse> {
|
||||
private async handleError(response: Response, tokenError: boolean): Promise<Res.Error> {
|
||||
if ((tokenError && response.status === 400) || response.status === 401 || response.status === 403) {
|
||||
this.logoutCallback(true);
|
||||
return null;
|
||||
@@ -402,7 +379,7 @@ export default class ApiService {
|
||||
responseJson = await response.json();
|
||||
}
|
||||
|
||||
return new ErrorResponse(responseJson, response.status, tokenError);
|
||||
return new Res.Error(responseJson, response.status, tokenError);
|
||||
}
|
||||
|
||||
private async handleTokenState(): Promise<string> {
|
||||
@@ -417,7 +394,7 @@ export default class ApiService {
|
||||
return 'Bearer ' + accessToken;
|
||||
}
|
||||
|
||||
private async doRefreshToken(): Promise<IdentityTokenResponse> {
|
||||
private async doRefreshToken(): Promise<Res.IdentityToken> {
|
||||
const refreshToken = await this.tokenService.getRefreshToken();
|
||||
if (refreshToken == null || refreshToken === '') {
|
||||
throw new Error();
|
||||
@@ -440,7 +417,7 @@ export default class ApiService {
|
||||
|
||||
if (response.status === 200) {
|
||||
const responseJson = await response.json();
|
||||
const tokenResponse = new IdentityTokenResponse(responseJson);
|
||||
const tokenResponse = new Res.IdentityToken(responseJson);
|
||||
await this.tokenService.setTokens(tokenResponse.accessToken, tokenResponse.refreshToken);
|
||||
return tokenResponse;
|
||||
} else {
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { Abstractions, Enums } from '@bitwarden/jslib';
|
||||
import { Abstractions, Enums, Request, Response } from '@bitwarden/jslib';
|
||||
|
||||
import { Cipher } from '../models/domain/cipher';
|
||||
import { CipherString } from '../models/domain/cipherString';
|
||||
@@ -7,10 +7,6 @@ import SymmetricCryptoKey from '../models/domain/symmetricCryptoKey';
|
||||
|
||||
import { CipherData } from '../models/data/cipherData';
|
||||
|
||||
import { CipherRequest } from '../models/request/cipherRequest';
|
||||
import { CipherResponse } from '../models/response/cipherResponse';
|
||||
import { ErrorResponse } from '../models/response/errorResponse';
|
||||
|
||||
import ApiService from './api.service';
|
||||
import ConstantsService from './constants.service';
|
||||
import CryptoService from './crypto.service';
|
||||
@@ -285,9 +281,9 @@ export default class CipherService {
|
||||
}
|
||||
|
||||
async saveWithServer(cipher: Cipher): Promise<any> {
|
||||
const request = new CipherRequest(cipher);
|
||||
const request = new Request.Cipher(cipher);
|
||||
|
||||
let response: CipherResponse;
|
||||
let response: Response.Cipher;
|
||||
if (cipher.id == null) {
|
||||
response = await this.apiService.postCipher(request);
|
||||
cipher.id = response.id;
|
||||
@@ -316,11 +312,11 @@ export default class CipherService {
|
||||
const blob = new Blob([encData], { type: 'application/octet-stream' });
|
||||
fd.append('data', blob, encFileName.encryptedString);
|
||||
|
||||
let response: CipherResponse;
|
||||
let response: Response.Cipher;
|
||||
try {
|
||||
response = await self.apiService.postCipherAttachment(cipher.id, fd);
|
||||
} catch (e) {
|
||||
reject((e as ErrorResponse).getSingleMessage());
|
||||
reject((e as Response.Error).getSingleMessage());
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -418,7 +414,7 @@ export default class CipherService {
|
||||
try {
|
||||
await this.apiService.deleteCipherAttachment(id, attachmentId);
|
||||
} catch (e) {
|
||||
return Promise.reject((e as ErrorResponse).getSingleMessage());
|
||||
return Promise.reject((e as Response.Error).getSingleMessage());
|
||||
}
|
||||
await this.deleteAttachment(id, attachmentId);
|
||||
}
|
||||
|
||||
@@ -1,11 +1,10 @@
|
||||
import * as forge from 'node-forge';
|
||||
|
||||
import { Abstractions, Enums, Services } from '@bitwarden/jslib';
|
||||
import { Abstractions, Enums, Response, Services } from '@bitwarden/jslib';
|
||||
|
||||
import { CipherString } from '../models/domain/cipherString';
|
||||
import EncryptedObject from '../models/domain/encryptedObject';
|
||||
import SymmetricCryptoKey from '../models/domain/symmetricCryptoKey';
|
||||
import { ProfileOrganizationResponse } from '../models/response/profileOrganizationResponse';
|
||||
|
||||
import ConstantsService from './constants.service';
|
||||
|
||||
@@ -77,7 +76,7 @@ export default class CryptoService implements CryptoServiceInterface {
|
||||
this.privateKey = null;
|
||||
}
|
||||
|
||||
setOrgKeys(orgs: ProfileOrganizationResponse[]): Promise<{}> {
|
||||
setOrgKeys(orgs: Response.ProfileOrganization[]): Promise<{}> {
|
||||
const orgKeys: any = {};
|
||||
orgs.forEach((org) => {
|
||||
orgKeys[org.id] = org.key;
|
||||
|
||||
@@ -1,16 +1,12 @@
|
||||
import { CipherString } from '../models/domain/cipherString';
|
||||
import { Folder } from '../models/domain/folder';
|
||||
|
||||
import { FolderData } from '../models/data/folderData';
|
||||
|
||||
import { FolderRequest } from '../models/request/folderRequest';
|
||||
import { FolderResponse } from '../models/response/folderResponse';
|
||||
|
||||
import ApiService from './api.service';
|
||||
import CryptoService from './crypto.service';
|
||||
import UserService from './user.service';
|
||||
|
||||
import { Abstractions } from '@bitwarden/jslib';
|
||||
import { Abstractions, Domain, Request, Response } from '@bitwarden/jslib';
|
||||
|
||||
const Keys = {
|
||||
foldersPrefix: 'folders_',
|
||||
@@ -28,14 +24,14 @@ export default class FolderService {
|
||||
this.decryptedFolderCache = null;
|
||||
}
|
||||
|
||||
async encrypt(model: any): Promise<Folder> {
|
||||
const folder = new Folder();
|
||||
async encrypt(model: any): Promise<Domain.Folder> {
|
||||
const folder = new Domain.Folder();
|
||||
folder.id = model.id;
|
||||
folder.name = await this.cryptoService.encrypt(model.name);
|
||||
return folder;
|
||||
}
|
||||
|
||||
async get(id: string): Promise<Folder> {
|
||||
async get(id: string): Promise<Domain.Folder> {
|
||||
const userId = await this.userService.getUserId();
|
||||
const folders = await this.storageService.get<{ [id: string]: FolderData; }>(
|
||||
Keys.foldersPrefix + userId);
|
||||
@@ -43,17 +39,17 @@ export default class FolderService {
|
||||
return null;
|
||||
}
|
||||
|
||||
return new Folder(folders[id]);
|
||||
return new Domain.Folder(folders[id]);
|
||||
}
|
||||
|
||||
async getAll(): Promise<Folder[]> {
|
||||
async getAll(): Promise<Domain.Folder[]> {
|
||||
const userId = await this.userService.getUserId();
|
||||
const folders = await this.storageService.get<{ [id: string]: FolderData; }>(
|
||||
Keys.foldersPrefix + userId);
|
||||
const response: Folder[] = [];
|
||||
const response: Domain.Folder[] = [];
|
||||
for (const id in folders) {
|
||||
if (folders.hasOwnProperty(id)) {
|
||||
response.push(new Folder(folders[id]));
|
||||
response.push(new Domain.Folder(folders[id]));
|
||||
}
|
||||
}
|
||||
return response;
|
||||
@@ -87,10 +83,10 @@ export default class FolderService {
|
||||
return this.decryptedFolderCache;
|
||||
}
|
||||
|
||||
async saveWithServer(folder: Folder): Promise<any> {
|
||||
const request = new FolderRequest(folder);
|
||||
async saveWithServer(folder: Domain.Folder): Promise<any> {
|
||||
const request = new Request.Folder(folder);
|
||||
|
||||
let response: FolderResponse;
|
||||
let response: Response.Folder;
|
||||
if (folder.id == null) {
|
||||
response = await this.apiService.postFolder(request);
|
||||
folder.id = response.id;
|
||||
|
||||
@@ -2,13 +2,6 @@ import { CipherData } from '../models/data/cipherData';
|
||||
import { CollectionData } from '../models/data/collectionData';
|
||||
import { FolderData } from '../models/data/folderData';
|
||||
|
||||
import { CipherResponse } from '../models/response/cipherResponse';
|
||||
import { CollectionResponse } from '../models/response/collectionResponse';
|
||||
import { DomainsResponse } from '../models/response/domainsResponse';
|
||||
import { FolderResponse } from '../models/response/folderResponse';
|
||||
import { ProfileResponse } from '../models/response/profileResponse';
|
||||
import { SyncResponse } from '../models/response/syncResponse';
|
||||
|
||||
import ApiService from './api.service';
|
||||
import CipherService from './cipher.service';
|
||||
import CollectionService from './collection.service';
|
||||
@@ -17,7 +10,7 @@ import FolderService from './folder.service';
|
||||
import SettingsService from './settings.service';
|
||||
import UserService from './user.service';
|
||||
|
||||
import { Abstractions } from '@bitwarden/jslib';
|
||||
import { Abstractions, Response } from '@bitwarden/jslib';
|
||||
|
||||
const Keys = {
|
||||
lastSyncPrefix: 'lastSync_',
|
||||
@@ -122,7 +115,7 @@ export default class SyncService {
|
||||
}
|
||||
}
|
||||
|
||||
private async syncProfile(response: ProfileResponse) {
|
||||
private async syncProfile(response: Response.Profile) {
|
||||
const stamp = await this.userService.getSecurityStamp();
|
||||
if (stamp != null && stamp !== response.securityStamp) {
|
||||
if (this.logoutCallback != null) {
|
||||
@@ -138,7 +131,7 @@ export default class SyncService {
|
||||
await this.userService.setSecurityStamp(response.securityStamp);
|
||||
}
|
||||
|
||||
private async syncFolders(userId: string, response: FolderResponse[]) {
|
||||
private async syncFolders(userId: string, response: Response.Folder[]) {
|
||||
const folders: { [id: string]: FolderData; } = {};
|
||||
response.forEach((f) => {
|
||||
folders[f.id] = new FolderData(f, userId);
|
||||
@@ -146,7 +139,7 @@ export default class SyncService {
|
||||
return await this.folderService.replace(folders);
|
||||
}
|
||||
|
||||
private async syncCollections(response: CollectionResponse[]) {
|
||||
private async syncCollections(response: Response.Collection[]) {
|
||||
const collections: { [id: string]: CollectionData; } = {};
|
||||
response.forEach((c) => {
|
||||
collections[c.id] = new CollectionData(c);
|
||||
@@ -154,7 +147,7 @@ export default class SyncService {
|
||||
return await this.collectionService.replace(collections);
|
||||
}
|
||||
|
||||
private async syncCiphers(userId: string, response: CipherResponse[]) {
|
||||
private async syncCiphers(userId: string, response: Response.Cipher[]) {
|
||||
const ciphers: { [id: string]: CipherData; } = {};
|
||||
response.forEach((c) => {
|
||||
ciphers[c.id] = new CipherData(c, userId);
|
||||
@@ -162,7 +155,7 @@ export default class SyncService {
|
||||
return await this.cipherService.replace(ciphers);
|
||||
}
|
||||
|
||||
private async syncSettings(userId: string, response: DomainsResponse) {
|
||||
private async syncSettings(userId: string, response: Response.Domains) {
|
||||
let eqDomains: string[][] = [];
|
||||
if (response != null && response.equivalentDomains != null) {
|
||||
eqDomains = eqDomains.concat(response.equivalentDomains);
|
||||
|
||||
Reference in New Issue
Block a user