1
0
mirror of https://github.com/bitwarden/browser synced 2026-02-28 18:43:26 +00:00
Files
browser/libs/common/src/models/export/cipher.export.ts
2025-11-04 15:53:15 -08:00

235 lines
7.3 KiB
TypeScript

import { EncString } from "../../key-management/crypto/models/enc-string";
import { CipherRepromptType } from "../../vault/enums/cipher-reprompt-type";
import { CipherType } from "../../vault/enums/cipher-type";
import { Cipher as CipherDomain } from "../../vault/models/domain/cipher";
import { CipherView } from "../../vault/models/view/cipher.view";
import { CardExport } from "./card.export";
import { FieldExport } from "./field.export";
import { IdentityExport } from "./identity.export";
import { LoginExport } from "./login.export";
import { PasswordHistoryExport } from "./password-history.export";
import { SecureNoteExport } from "./secure-note.export";
import { SshKeyExport } from "./ssh-key.export";
import { safeGetString } from "./utils";
export class CipherExport {
constructor() {
this.archivedDate = new Date();
this.creationDate = new Date();
this.deletedDate = new Date();
this.revisionDate = new Date();
}
static template(): CipherExport {
const req = new CipherExport();
req.organizationId = "";
req.collectionIds = [];
req.folderId = "";
req.type = CipherType.Login;
req.name = "Item name";
req.notes = "Some notes about this item.";
req.favorite = false;
req.fields = [];
req.reprompt = CipherRepromptType.None;
req.passwordHistory = [];
req.creationDate = new Date();
req.revisionDate = new Date();
req.deletedDate = new Date();
req.archivedDate = new Date();
return req;
}
static toView(req: CipherExport, view = new CipherView()) {
view.type = req.type;
view.folderId = req.folderId;
if (view.organizationId == null) {
view.organizationId = req.organizationId;
}
if (view.collectionIds || req.collectionIds) {
const set = new Set((view.collectionIds ?? []).concat(req.collectionIds ?? []));
view.collectionIds = Array.from(set.values());
}
view.name = req.name;
view.notes = req.notes;
view.favorite = req.favorite;
view.reprompt = req.reprompt ?? CipherRepromptType.None;
view.key = new EncString(req.key ?? "");
if (req.fields != null) {
view.fields = req.fields.map((f) => FieldExport.toView(f));
}
switch (req.type) {
case CipherType.Login:
if (!req.login) {
break;
}
view.login = LoginExport.toView(req.login);
break;
case CipherType.SecureNote:
if (!req.secureNote) {
break;
}
view.secureNote = SecureNoteExport.toView(req.secureNote);
break;
case CipherType.Card:
if (!req.card) {
break;
}
view.card = CardExport.toView(req.card);
break;
case CipherType.Identity:
if (!req.identity) {
break;
}
view.identity = IdentityExport.toView(req.identity);
break;
case CipherType.SshKey:
if (!req.sshKey) {
break;
}
view.sshKey = SshKeyExport.toView(req.sshKey);
break;
}
if (req.passwordHistory != null) {
view.passwordHistory = req.passwordHistory.map((ph) => PasswordHistoryExport.toView(ph));
}
view.creationDate = req.creationDate ? new Date(req.creationDate) : view.creationDate;
view.revisionDate = req.revisionDate ? new Date(req.revisionDate) : view.revisionDate;
view.deletedDate = req.deletedDate ? new Date(req.deletedDate) : view.deletedDate;
view.archivedDate = req.archivedDate ? new Date(req.archivedDate) : view.archivedDate;
return view;
}
static toDomain(req: CipherExport, domain = new CipherDomain()) {
domain.type = req.type;
domain.folderId = req.folderId;
if (domain.organizationId == null) {
domain.organizationId = req.organizationId;
}
domain.name = new EncString(req.name ? req.name : "");
domain.notes = new EncString(req.notes ? req.notes : "");
domain.favorite = req.favorite;
domain.reprompt = req.reprompt ?? CipherRepromptType.None;
domain.key = new EncString(req.key ? req.key : "");
if (req.fields != null) {
domain.fields = req.fields.map((f) => FieldExport.toDomain(f));
}
switch (req.type) {
case CipherType.Login:
if (!req.login) {
break;
}
domain.login = LoginExport.toDomain(req.login);
break;
case CipherType.SecureNote:
if (!req.secureNote) {
break;
}
domain.secureNote = SecureNoteExport.toDomain(req.secureNote);
break;
case CipherType.Card:
if (!req.card) {
break;
}
domain.card = CardExport.toDomain(req.card);
break;
case CipherType.Identity:
if (!req.identity) {
break;
}
domain.identity = IdentityExport.toDomain(req.identity);
break;
case CipherType.SshKey:
if (!req.sshKey) {
break;
}
domain.sshKey = SshKeyExport.toDomain(req.sshKey);
break;
}
if (req.passwordHistory != null) {
domain.passwordHistory = req.passwordHistory.map((ph) => PasswordHistoryExport.toDomain(ph));
}
domain.creationDate = req.creationDate ? new Date(req.creationDate) : new Date();
domain.revisionDate = req.revisionDate ? new Date(req.revisionDate) : new Date();
domain.deletedDate = req.deletedDate ? new Date(req.deletedDate) : new Date();
domain.archivedDate = req.archivedDate ? new Date(req.archivedDate) : new Date();
return domain;
}
type: CipherType = CipherType.Login;
folderId?: string;
organizationId?: string;
collectionIds: string[] = [];
name: string = "";
notes?: string;
favorite: boolean = false;
fields: FieldExport[] = [];
login?: LoginExport;
secureNote?: SecureNoteExport;
card?: CardExport;
identity?: IdentityExport;
sshKey?: SshKeyExport;
reprompt: CipherRepromptType = CipherRepromptType.None;
passwordHistory: PasswordHistoryExport[] = [];
revisionDate: Date;
creationDate: Date;
deletedDate: Date;
archivedDate: Date;
key?: string;
// Use build method instead of ctor so that we can control order of JSON stringify for pretty print
build(o: CipherView | CipherDomain) {
this.organizationId = o.organizationId;
this.folderId = o.folderId;
this.type = o.type;
this.reprompt = o.reprompt;
this.name = safeGetString(o.name);
this.notes = safeGetString(o.notes);
if ("key" in o) {
this.key = o.key?.encryptedString ?? "";
}
this.favorite = o.favorite;
if (o.fields != null) {
this.fields = o.fields.map((f) => new FieldExport(f));
}
switch (o.type) {
case CipherType.Login:
this.login = new LoginExport(o.login);
break;
case CipherType.SecureNote:
this.secureNote = new SecureNoteExport(o.secureNote);
break;
case CipherType.Card:
this.card = new CardExport(o.card);
break;
case CipherType.Identity:
this.identity = new IdentityExport(o.identity);
break;
case CipherType.SshKey:
this.sshKey = new SshKeyExport(o.sshKey);
break;
}
if (o.passwordHistory != null) {
this.passwordHistory = o.passwordHistory.map((ph) => new PasswordHistoryExport(ph));
}
this.creationDate = o.creationDate;
this.revisionDate = o.revisionDate;
this.deletedDate = o.deletedDate ?? new Date();
this.archivedDate = o.archivedDate ?? new Date();
}
}