mirror of
https://github.com/bitwarden/browser
synced 2025-12-11 05:43:41 +00:00
* refactor: move SCIM component to admin-console, refs EC-1011 * refactor: move scimProviderType to admin-console, refs EC-1011 * refactor: move scim-config.api to admin-console, refs EC-1011 * refactor: create models folder and nest existing api contents, refs EC-1011 * refactor: move scim-config to admin-console models, refs EC-1011 * refactor: move billing.component to billing, refs EC-1011 * refactor: remove nested app folder from new billing structure, refs EC-1011 * refactor: move organizations/billing to billing, refs EC-1011 * refactor: move add-credit and adjust-payment to billing/settings, refs EC-1011 * refactor: billing history/sync to billing, refs EC-1011 * refactor: move org plans, payment/method to billing/settings, refs EC-1011 * fix: update legacy file paths for payment-method and tax-info, refs EC-1011 * fix: update imports for scim component, refs EC-1011 * refactor: move subscription and tax-info into billing, refs EC-1011 * refactor: move user-subscription to billing, refs EC-1011 * refactor: move images/cards to billing and update base path, refs EC-1011 * refactor: move payment-method, plan subscription, and plan to billing, refs EC-1011 * refactor: move transaction-type to billing, refs EC-1011 * refactor: move billing-sync-config to billing, refs EC-1011 * refactor: move billing-sync and bit-pay-invoice request to billing, refs EC-1011 * refactor: move org subscription and tax info update requests to billing, refs EC-1011 * fix: broken paths to billing, refs EC-1011 * refactor: move payment request to billing, refs EC-1011 * fix: update remaining imports for payment-request, refs EC-1011 * refactor: move tax-info-update to billing, refs EC-1011 * refactor: move billing-payment, billing-history, and billing responses to billing, refs EC-1011 * refactor: move organization-subscription-responset to billing, refs EC-1011 * refactor: move payment and plan responses to billing, refs EC-1011 * refactor: move subscription response to billing ,refs EC-1011 * refactor: move tax info and rate responses to billing, refs EC-1011 * fix: update remaining path to base response for tax-rate response, refs EC-1011 * refactor: (browser) move organization-service to admin-console, refs EC-1011 * refactor: (browser) move organizaiton-service to admin-console, refs EC-1011 * refactor: (cli) move share command to admin-console, refs EC-1011 * refactor: move organization-collect request model to admin-console, refs EC-1011 * refactor: (web) move organization, collection/user responses to admin-console, refs EC-1011 * refactor: (cli) move selection-read-only to admin-console, refs EC-1011 * refactor: (desktop) move organization-filter to admin-console, refs EC-1011 * refactor: (web) move organization-switcher to admin-console, refs EC-1011 * refactor: (web) move access-selector to admin-console, refs EC-1011 * refactor: (web) move create folder to admin-console, refs EC-1011 * refactor: (web) move org guards folder to admin-console, refs EC-1011 * refactor: (web) move org layout to admin-console, refs EC-1011 * refactor: move manage collections to admin console, refs EC-1011 * refactor: (web) move collection-dialog to admin-console, refs EC-1011 * refactor: (web) move entity users/events and events component to admin-console, refs EC-1011 * refactor: (web) move groups/group-add-edit to admin-console, refs EC-1011 * refactor: (web) move manage, org-manage module, and user-confirm to admin-console, refs EC-1011 * refactor: (web) move people to admin-console, refs EC-1011 * refactor: (web) move reset-password to admin-console, refs EC-1011 * refactor: (web) move organization-routing and module to admin-console, refs EC-1011 * refactor: move admin-console and billing within app scope, refs EC-1011 * fix: update leftover merge conflicts, refs EC-1011 * refactor: (web) member-dialog to admin-console, refs EC-1011 * refactor: (web) move policies to admin-console, refs EC-1011 * refactor: (web) move reporting to admin-console, refs EC-1011 * refactor: (web) move settings to admin-console, refs EC-1011 * refactor: (web) move sponsorships to admin-console, refs EC-1011 * refactor: (web) move tools to admin-console, refs EC-1011 * refactor: (web) move users to admin-console, refs EC-1011 * refactor: (web) move collections to admin-console, refs EC-1011 * refactor: (web) move create-organization to admin-console, refs EC-1011 * refactor: (web) move licensed components to admin-console, refs EC-1011 * refactor: (web) move bit organization modules to admin-console, refs EC-1011 * fix: update leftover import statements for organizations.module, refs EC-1011 * refactor: (web) move personal vault and max timeout to admin-console, refs EC-1011 * refactor: (web) move providers to admin-console, refs EC-1011 * refactor: (libs) move organization service to admin-console, refs EC-1011 * refactor: (libs) move profile org/provider responses and other misc org responses to admin-console, refs EC-1011 * refactor: (libs) move provider request and selectionion-read-only request to admin-console, refs EC-1011 * fix: update missed import path for provider-user-update request, refs EC-1011 * refactor: (libs) move abstractions to admin-console, refs EC-1011 * refactor: (libs) move org/provider enums to admin-console, refs EC-1011 * fix: update downstream import statements from libs changes, refs EC-1011 * refactor: (libs) move data files to admin-console, refs EC-1011 * refactor: (libs) move domain to admin-console, refs EC-1011 * refactor: (libs) move request objects to admin-console, refs EC-1011 * fix: update downstream import changes from libs, refs EC-1011 * refactor: move leftover provider files to admin-console, refs EC-1011 * refactor: (browser) move group policy environment to admin-console, refs EC-1011 * fix: (browser) update downstream import statements, refs EC-1011 * fix: (desktop) update downstream libs moves, refs EC-1011 * fix: (cli) update downstream import changes from libs, refs EC-1011 * refactor: move org-auth related files to admin-console, refs EC-1011 * refactor: (libs) move request objects to admin-console, refs EC-1011 * refactor: move persmissions to admin-console, refs EC-1011 * refactor: move sponsored families to admin-console and fix libs changes, refs EC-1011 * refactor: move collections to admin-console, refs EC-1011 * refactor: move spec file back to spec scope, refs EC-1011 * fix: update downstream imports due to libs changes, refs EC-1011 * fix: udpate downstream import changes due to libs, refs EC-1011 * fix: update downstream imports due to libs changes, refs EC-1011 * fix: update downstream imports from libs changes, refs EC-1011 * fix: update path malformation in jslib-services.module, refs EC-1011 * fix: lint errors from improper casing, refs AC-1011 * fix: update downstream filename changes, refs AC-1011 * fix: (cli) update downstream filename changes, refs AC-1011 * fix: (desktop) update downstream filename changes, refs AC-1011 * fix: (browser) update downstream filename changes, refs AC-1011 * fix: lint errors, refs AC-1011 * fix: prettier, refs AC-1011 * fix: lint fixes for import order, refs AC-1011 * fix: update import path for provider user type, refs AC-1011 * fix: update new codes import paths for admin console structure, refs AC-1011 * fix: lint/prettier, refs AC-1011 * fix: update layout stories path, refs AC-1011 * fix: update comoponents card icons base variable in styles, refs AC-1011 * fix: update provider service path in permissions guard spec, refs AC-1011 * fix: update provider permission guard path, refs AC-1011 * fix: remove unecessary TODO for shared index export statement, refs AC-1011 * refactor: move browser-organization service and cli organization-user response out of admin-console, refs AC-1011 * refactor: move web/browser/desktop collections component to vault domain, refs AC-1011 * refactor: move organization.module out of admin-console scope, refs AC-1011 * fix: prettier, refs AC-1011 * refactor: move organizations-api-key.request out of admin-console scope, refs AC-1011
255 lines
9.7 KiB
TypeScript
255 lines
9.7 KiB
TypeScript
import { ApiService } from "@bitwarden/common/abstractions/api.service";
|
|
import { OrganizationUserService } from "@bitwarden/common/abstractions/organization-user/organization-user.service";
|
|
import { SearchService } from "@bitwarden/common/abstractions/search.service";
|
|
import { CollectionService } from "@bitwarden/common/admin-console/abstractions/collection.service";
|
|
import { OrganizationService } from "@bitwarden/common/admin-console/abstractions/organization/organization.service.abstraction";
|
|
import { CollectionData } from "@bitwarden/common/admin-console/models/data/collection.data";
|
|
import { Collection } from "@bitwarden/common/admin-console/models/domain/collection";
|
|
import {
|
|
CollectionDetailsResponse as ApiCollectionDetailsResponse,
|
|
CollectionResponse as ApiCollectionResponse,
|
|
} from "@bitwarden/common/admin-console/models/response/collection.response";
|
|
import { Utils } from "@bitwarden/common/misc/utils";
|
|
import { ListResponse as ApiListResponse } from "@bitwarden/common/models/response/list.response";
|
|
import { CipherService } from "@bitwarden/common/vault/abstractions/cipher.service";
|
|
import { FolderService } from "@bitwarden/common/vault/abstractions/folder/folder.service.abstraction";
|
|
import { CipherView } from "@bitwarden/common/vault/models/view/cipher.view";
|
|
|
|
import { CollectionResponse } from "../admin-console/models/response/collection.response";
|
|
import { OrganizationResponse } from "../admin-console/models/response/organization.response";
|
|
import { Response } from "../models/response";
|
|
import { ListResponse } from "../models/response/list.response";
|
|
import { OrganizationUserResponse } from "../models/response/organization-user.response";
|
|
import { CliUtils } from "../utils";
|
|
import { CipherResponse } from "../vault/models/cipher.response";
|
|
import { FolderResponse } from "../vault/models/folder.response";
|
|
|
|
export class ListCommand {
|
|
constructor(
|
|
private cipherService: CipherService,
|
|
private folderService: FolderService,
|
|
private collectionService: CollectionService,
|
|
private organizationService: OrganizationService,
|
|
private searchService: SearchService,
|
|
private organizationUserService: OrganizationUserService,
|
|
private apiService: ApiService
|
|
) {}
|
|
|
|
async run(object: string, cmdOptions: Record<string, any>): Promise<Response> {
|
|
const normalizedOptions = new Options(cmdOptions);
|
|
switch (object.toLowerCase()) {
|
|
case "items":
|
|
return await this.listCiphers(normalizedOptions);
|
|
case "folders":
|
|
return await this.listFolders(normalizedOptions);
|
|
case "collections":
|
|
return await this.listCollections(normalizedOptions);
|
|
case "org-collections":
|
|
return await this.listOrganizationCollections(normalizedOptions);
|
|
case "org-members":
|
|
return await this.listOrganizationMembers(normalizedOptions);
|
|
case "organizations":
|
|
return await this.listOrganizations(normalizedOptions);
|
|
default:
|
|
return Response.badRequest("Unknown object.");
|
|
}
|
|
}
|
|
|
|
private async listCiphers(options: Options) {
|
|
let ciphers: CipherView[];
|
|
options.trash = options.trash || false;
|
|
if (options.url != null && options.url.trim() !== "") {
|
|
ciphers = await this.cipherService.getAllDecryptedForUrl(options.url);
|
|
} else {
|
|
ciphers = await this.cipherService.getAllDecrypted();
|
|
}
|
|
|
|
if (
|
|
options.folderId != null ||
|
|
options.collectionId != null ||
|
|
options.organizationId != null
|
|
) {
|
|
ciphers = ciphers.filter((c) => {
|
|
if (options.trash !== c.isDeleted) {
|
|
return false;
|
|
}
|
|
if (options.folderId != null) {
|
|
if (options.folderId === "notnull" && c.folderId != null) {
|
|
return true;
|
|
}
|
|
const folderId = options.folderId === "null" ? null : options.folderId;
|
|
if (folderId === c.folderId) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (options.organizationId != null) {
|
|
if (options.organizationId === "notnull" && c.organizationId != null) {
|
|
return true;
|
|
}
|
|
const organizationId = options.organizationId === "null" ? null : options.organizationId;
|
|
if (organizationId === c.organizationId) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (options.collectionId != null) {
|
|
if (
|
|
options.collectionId === "notnull" &&
|
|
c.collectionIds != null &&
|
|
c.collectionIds.length > 0
|
|
) {
|
|
return true;
|
|
}
|
|
const collectionId = options.collectionId === "null" ? null : options.collectionId;
|
|
if (collectionId == null && (c.collectionIds == null || c.collectionIds.length === 0)) {
|
|
return true;
|
|
}
|
|
if (
|
|
collectionId != null &&
|
|
c.collectionIds != null &&
|
|
c.collectionIds.indexOf(collectionId) > -1
|
|
) {
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
});
|
|
} else if (options.search == null || options.search.trim() === "") {
|
|
ciphers = ciphers.filter((c) => options.trash === c.isDeleted);
|
|
}
|
|
|
|
if (options.search != null && options.search.trim() !== "") {
|
|
ciphers = this.searchService.searchCiphersBasic(ciphers, options.search, options.trash);
|
|
}
|
|
|
|
const res = new ListResponse(ciphers.map((o) => new CipherResponse(o)));
|
|
return Response.success(res);
|
|
}
|
|
|
|
private async listFolders(options: Options) {
|
|
let folders = await this.folderService.getAllDecryptedFromState();
|
|
|
|
if (options.search != null && options.search.trim() !== "") {
|
|
folders = CliUtils.searchFolders(folders, options.search);
|
|
}
|
|
|
|
const res = new ListResponse(folders.map((o) => new FolderResponse(o)));
|
|
return Response.success(res);
|
|
}
|
|
|
|
private async listCollections(options: Options) {
|
|
let collections = await this.collectionService.getAllDecrypted();
|
|
|
|
if (options.organizationId != null) {
|
|
collections = collections.filter((c) => {
|
|
if (options.organizationId === c.organizationId) {
|
|
return true;
|
|
}
|
|
return false;
|
|
});
|
|
}
|
|
|
|
if (options.search != null && options.search.trim() !== "") {
|
|
collections = CliUtils.searchCollections(collections, options.search);
|
|
}
|
|
|
|
const res = new ListResponse(collections.map((o) => new CollectionResponse(o)));
|
|
return Response.success(res);
|
|
}
|
|
|
|
private async listOrganizationCollections(options: Options) {
|
|
if (options.organizationId == null || options.organizationId === "") {
|
|
return Response.badRequest("`organizationid` option is required.");
|
|
}
|
|
if (!Utils.isGuid(options.organizationId)) {
|
|
return Response.badRequest("`" + options.organizationId + "` is not a GUID.");
|
|
}
|
|
const organization = await this.organizationService.getFromState(options.organizationId);
|
|
if (organization == null) {
|
|
return Response.error("Organization not found.");
|
|
}
|
|
|
|
try {
|
|
let response: ApiListResponse<ApiCollectionResponse>;
|
|
if (organization.canViewAllCollections) {
|
|
response = await this.apiService.getCollections(options.organizationId);
|
|
} else {
|
|
response = await this.apiService.getUserCollections();
|
|
}
|
|
const collections = response.data
|
|
.filter((c) => c.organizationId === options.organizationId)
|
|
.map((r) => new Collection(new CollectionData(r as ApiCollectionDetailsResponse)));
|
|
let decCollections = await this.collectionService.decryptMany(collections);
|
|
if (options.search != null && options.search.trim() !== "") {
|
|
decCollections = CliUtils.searchCollections(decCollections, options.search);
|
|
}
|
|
const res = new ListResponse(decCollections.map((o) => new CollectionResponse(o)));
|
|
return Response.success(res);
|
|
} catch (e) {
|
|
return Response.error(e);
|
|
}
|
|
}
|
|
|
|
private async listOrganizationMembers(options: Options) {
|
|
if (options.organizationId == null || options.organizationId === "") {
|
|
return Response.badRequest("`organizationid` option is required.");
|
|
}
|
|
if (!Utils.isGuid(options.organizationId)) {
|
|
return Response.badRequest("`" + options.organizationId + "` is not a GUID.");
|
|
}
|
|
const organization = await this.organizationService.getFromState(options.organizationId);
|
|
if (organization == null) {
|
|
return Response.error("Organization not found.");
|
|
}
|
|
|
|
try {
|
|
const response = await this.organizationUserService.getAllUsers(options.organizationId);
|
|
const res = new ListResponse(
|
|
response.data.map((r) => {
|
|
const u = new OrganizationUserResponse();
|
|
u.email = r.email;
|
|
u.name = r.name;
|
|
u.id = r.id;
|
|
u.status = r.status;
|
|
u.type = r.type;
|
|
u.twoFactorEnabled = r.twoFactorEnabled;
|
|
return u;
|
|
})
|
|
);
|
|
return Response.success(res);
|
|
} catch (e) {
|
|
return Response.error(e);
|
|
}
|
|
}
|
|
|
|
private async listOrganizations(options: Options) {
|
|
let organizations = await this.organizationService.getAll();
|
|
|
|
if (options.search != null && options.search.trim() !== "") {
|
|
organizations = CliUtils.searchOrganizations(organizations, options.search);
|
|
}
|
|
|
|
const res = new ListResponse(organizations.map((o) => new OrganizationResponse(o)));
|
|
return Response.success(res);
|
|
}
|
|
}
|
|
|
|
class Options {
|
|
organizationId: string;
|
|
collectionId: string;
|
|
folderId: string;
|
|
search: string;
|
|
url: string;
|
|
trash: boolean;
|
|
|
|
constructor(passedOptions: Record<string, any>) {
|
|
this.organizationId = passedOptions?.organizationid || passedOptions?.organizationId;
|
|
this.collectionId = passedOptions?.collectionid || passedOptions?.collectionId;
|
|
this.folderId = passedOptions?.folderid || passedOptions?.folderId;
|
|
this.search = passedOptions?.search;
|
|
this.url = passedOptions?.url;
|
|
this.trash = CliUtils.convertBooleanOption(passedOptions?.trash);
|
|
}
|
|
}
|