1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-16 16:23:44 +00:00

Merge branch 'master' into EC-598-beeep-properly-store-passkeys-in-bitwarden

This commit is contained in:
Andreas Coroiu
2023-04-04 09:41:22 +02:00
1522 changed files with 81163 additions and 24882 deletions

View File

@@ -1,3 +1,42 @@
import { OrganizationConnectionType } from "../admin-console/enums/organization-connection-type";
import { CollectionRequest } from "../admin-console/models/request/collection.request";
import { OrganizationConnectionRequest } from "../admin-console/models/request/organization-connection.request";
import { OrganizationSponsorshipCreateRequest } from "../admin-console/models/request/organization/organization-sponsorship-create.request";
import { OrganizationSponsorshipRedeemRequest } from "../admin-console/models/request/organization/organization-sponsorship-redeem.request";
import { ProviderAddOrganizationRequest } from "../admin-console/models/request/provider/provider-add-organization.request";
import { ProviderOrganizationCreateRequest } from "../admin-console/models/request/provider/provider-organization-create.request";
import { ProviderSetupRequest } from "../admin-console/models/request/provider/provider-setup.request";
import { ProviderUpdateRequest } from "../admin-console/models/request/provider/provider-update.request";
import { ProviderUserAcceptRequest } from "../admin-console/models/request/provider/provider-user-accept.request";
import { ProviderUserBulkConfirmRequest } from "../admin-console/models/request/provider/provider-user-bulk-confirm.request";
import { ProviderUserBulkRequest } from "../admin-console/models/request/provider/provider-user-bulk.request";
import { ProviderUserConfirmRequest } from "../admin-console/models/request/provider/provider-user-confirm.request";
import { ProviderUserInviteRequest } from "../admin-console/models/request/provider/provider-user-invite.request";
import { ProviderUserUpdateRequest } from "../admin-console/models/request/provider/provider-user-update.request";
import { SelectionReadOnlyRequest } from "../admin-console/models/request/selection-read-only.request";
import {
CollectionAccessDetailsResponse,
CollectionResponse,
} from "../admin-console/models/response/collection.response";
import {
OrganizationConnectionConfigApis,
OrganizationConnectionResponse,
} from "../admin-console/models/response/organization-connection.response";
import { OrganizationExportResponse } from "../admin-console/models/response/organization-export.response";
import { OrganizationSponsorshipSyncStatusResponse } from "../admin-console/models/response/organization-sponsorship-sync-status.response";
import { PolicyResponse } from "../admin-console/models/response/policy.response";
import {
ProviderOrganizationOrganizationDetailsResponse,
ProviderOrganizationResponse,
} from "../admin-console/models/response/provider/provider-organization.response";
import { ProviderUserBulkPublicKeyResponse } from "../admin-console/models/response/provider/provider-user-bulk-public-key.response";
import { ProviderUserBulkResponse } from "../admin-console/models/response/provider/provider-user-bulk.response";
import {
ProviderUserResponse,
ProviderUserUserDetailsResponse,
} from "../admin-console/models/response/provider/provider-user.response";
import { ProviderResponse } from "../admin-console/models/response/provider/provider.response";
import { SelectionReadOnlyResponse } from "../admin-console/models/response/selection-read-only.response";
import { DeviceVerificationRequest } from "../auth/models/request/device-verification.request";
import { EmailTokenRequest } from "../auth/models/request/email-token.request";
import { EmailRequest } from "../auth/models/request/email.request";
@@ -54,83 +93,37 @@ import {
TwoFactorWebAuthnResponse,
} from "../auth/models/response/two-factor-web-authn.response";
import { TwoFactorYubiKeyResponse } from "../auth/models/response/two-factor-yubi-key.response";
import { OrganizationConnectionType } from "../enums/organizationConnectionType";
import { BitPayInvoiceRequest } from "../models/request/bit-pay-invoice.request";
import { BitPayInvoiceRequest } from "../billing/models/request/bit-pay-invoice.request";
import { PaymentRequest } from "../billing/models/request/payment.request";
import { TaxInfoUpdateRequest } from "../billing/models/request/tax-info-update.request";
import { BillingHistoryResponse } from "../billing/models/response/billing-history.response";
import { BillingPaymentResponse } from "../billing/models/response/billing-payment.response";
import { PaymentResponse } from "../billing/models/response/payment.response";
import { PlanResponse } from "../billing/models/response/plan.response";
import { SubscriptionResponse } from "../billing/models/response/subscription.response";
import { TaxInfoResponse } from "../billing/models/response/tax-info.response";
import { TaxRateResponse } from "../billing/models/response/tax-rate.response";
import { CollectionBulkDeleteRequest } from "../models/request/collection-bulk-delete.request";
import { CollectionRequest } from "../models/request/collection.request";
import { DeleteRecoverRequest } from "../models/request/delete-recover.request";
import { EventRequest } from "../models/request/event.request";
import { IapCheckRequest } from "../models/request/iap-check.request";
import { KdfRequest } from "../models/request/kdf.request";
import { KeysRequest } from "../models/request/keys.request";
import { OrganizationConnectionRequest } from "../models/request/organization-connection.request";
import { OrganizationImportRequest } from "../models/request/organization-import.request";
import { OrganizationSponsorshipCreateRequest } from "../models/request/organization/organization-sponsorship-create.request";
import { OrganizationSponsorshipRedeemRequest } from "../models/request/organization/organization-sponsorship-redeem.request";
import { PaymentRequest } from "../models/request/payment.request";
import { PreloginRequest } from "../models/request/prelogin.request";
import { ProviderAddOrganizationRequest } from "../models/request/provider/provider-add-organization.request";
import { ProviderOrganizationCreateRequest } from "../models/request/provider/provider-organization-create.request";
import { ProviderSetupRequest } from "../models/request/provider/provider-setup.request";
import { ProviderUpdateRequest } from "../models/request/provider/provider-update.request";
import { ProviderUserAcceptRequest } from "../models/request/provider/provider-user-accept.request";
import { ProviderUserBulkConfirmRequest } from "../models/request/provider/provider-user-bulk-confirm.request";
import { ProviderUserBulkRequest } from "../models/request/provider/provider-user-bulk.request";
import { ProviderUserConfirmRequest } from "../models/request/provider/provider-user-confirm.request";
import { ProviderUserInviteRequest } from "../models/request/provider/provider-user-invite.request";
import { ProviderUserUpdateRequest } from "../models/request/provider/provider-user-update.request";
import { RegisterRequest } from "../models/request/register.request";
import { SelectionReadOnlyRequest } from "../models/request/selection-read-only.request";
import { SendAccessRequest } from "../models/request/send-access.request";
import { SendRequest } from "../models/request/send.request";
import { StorageRequest } from "../models/request/storage.request";
import { TaxInfoUpdateRequest } from "../models/request/tax-info-update.request";
import { UpdateAvatarRequest } from "../models/request/update-avatar.request";
import { UpdateDomainsRequest } from "../models/request/update-domains.request";
import { UpdateKeyRequest } from "../models/request/update-key.request";
import { VerifyDeleteRecoverRequest } from "../models/request/verify-delete-recover.request";
import { VerifyEmailRequest } from "../models/request/verify-email.request";
import { BillingHistoryResponse } from "../models/response/billing-history.response";
import { BillingPaymentResponse } from "../models/response/billing-payment.response";
import { BreachAccountResponse } from "../models/response/breach-account.response";
import {
CollectionAccessDetailsResponse,
CollectionResponse,
} from "../models/response/collection.response";
import { DomainsResponse } from "../models/response/domains.response";
import { EventResponse } from "../models/response/event.response";
import { ListResponse } from "../models/response/list.response";
import {
OrganizationConnectionConfigApis,
OrganizationConnectionResponse,
} from "../models/response/organization-connection.response";
import { OrganizationExportResponse } from "../models/response/organization-export.response";
import { OrganizationSponsorshipSyncStatusResponse } from "../models/response/organization-sponsorship-sync-status.response";
import { PaymentResponse } from "../models/response/payment.response";
import { PlanResponse } from "../models/response/plan.response";
import { PolicyResponse } from "../models/response/policy.response";
import { ProfileResponse } from "../models/response/profile.response";
import {
ProviderOrganizationOrganizationDetailsResponse,
ProviderOrganizationResponse,
} from "../models/response/provider/provider-organization.response";
import { ProviderUserBulkPublicKeyResponse } from "../models/response/provider/provider-user-bulk-public-key.response";
import { ProviderUserBulkResponse } from "../models/response/provider/provider-user-bulk.response";
import {
ProviderUserResponse,
ProviderUserUserDetailsResponse,
} from "../models/response/provider/provider-user.response";
import { ProviderResponse } from "../models/response/provider/provider.response";
import { SelectionReadOnlyResponse } from "../models/response/selection-read-only.response";
import { SendAccessResponse } from "../models/response/send-access.response";
import { SendFileDownloadDataResponse } from "../models/response/send-file-download-data.response";
import { SendFileUploadDataResponse } from "../models/response/send-file-upload-data.response";
import { SendResponse } from "../models/response/send.response";
import { SubscriptionResponse } from "../models/response/subscription.response";
import { TaxInfoResponse } from "../models/response/tax-info.response";
import { TaxRateResponse } from "../models/response/tax-rate.response";
import { UserKeyResponse } from "../models/response/user-key.response";
import { SendAccessView } from "../models/view/send-access.view";
import { AttachmentRequest } from "../vault/models/request/attachment.request";
import { CipherBulkDeleteRequest } from "../vault/models/request/cipher-bulk-delete.request";
import { CipherBulkMoveRequest } from "../vault/models/request/cipher-bulk-move.request";
@@ -213,31 +206,6 @@ export abstract class ApiService {
getUserBillingHistory: () => Promise<BillingHistoryResponse>;
getUserBillingPayment: () => Promise<BillingPaymentResponse>;
getSend: (id: string) => Promise<SendResponse>;
postSendAccess: (
id: string,
request: SendAccessRequest,
apiUrl?: string
) => Promise<SendAccessResponse>;
getSends: () => Promise<ListResponse<SendResponse>>;
postSend: (request: SendRequest) => Promise<SendResponse>;
postFileTypeSend: (request: SendRequest) => Promise<SendFileUploadDataResponse>;
postSendFile: (sendId: string, fileId: string, data: FormData) => Promise<any>;
/**
* @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.
*/
postSendFileLegacy: (data: FormData) => Promise<SendResponse>;
putSend: (id: string, request: SendRequest) => Promise<SendResponse>;
putSendRemovePassword: (id: string) => Promise<SendResponse>;
deleteSend: (id: string) => Promise<any>;
getSendFileDownloadData: (
send: SendAccessView,
request: SendAccessRequest,
apiUrl?: string
) => Promise<SendFileDownloadDataResponse>;
renewSendFileUploadUrl: (sendId: string, fileId: string) => Promise<SendFileUploadDataResponse>;
getCipher: (id: string) => Promise<CipherResponse>;
getFullCipherDetails: (id: string) => Promise<CipherResponse>;
getCipherAdmin: (id: string) => Promise<CipherResponse>;

View File

@@ -1,3 +1,6 @@
import { ProfileOrganizationResponse } from "../admin-console/models/response/profile-organization.response";
import { ProfileProviderOrganizationResponse } from "../admin-console/models/response/profile-provider-organization.response";
import { ProfileProviderResponse } from "../admin-console/models/response/profile-provider.response";
import { KdfConfig } from "../auth/models/domain/kdf-config";
import { HashPurpose } from "../enums/hashPurpose";
import { KdfType } from "../enums/kdfType";
@@ -5,9 +8,6 @@ import { KeySuffixOptions } from "../enums/keySuffixOptions";
import { EncArrayBuffer } from "../models/domain/enc-array-buffer";
import { EncString } from "../models/domain/enc-string";
import { SymmetricCryptoKey } from "../models/domain/symmetric-crypto-key";
import { ProfileOrganizationResponse } from "../models/response/profile-organization.response";
import { ProfileProviderOrganizationResponse } from "../models/response/profile-provider-organization.response";
import { ProfileProviderResponse } from "../models/response/profile-provider.response";
export abstract class CryptoService {
setKey: (key: SymmetricCryptoKey) => Promise<any>;

View File

@@ -0,0 +1,18 @@
import { FileUploadType } from "../../enums/fileUploadType";
import { EncArrayBuffer } from "../../models/domain/enc-array-buffer";
import { EncString } from "../../models/domain/enc-string";
export abstract class FileUploadService {
upload: (
uploadData: { url: string; fileUploadType: FileUploadType },
fileName: EncString,
encryptedFileData: EncArrayBuffer,
fileUploadMethods: FileUploadApiMethods
) => Promise<void>;
}
export type FileUploadApiMethods = {
postDirect: (fileData: FormData) => Promise<void>;
renewFileUploadUrl: () => Promise<string>;
rollback: () => Promise<void>;
};

View File

@@ -1,18 +0,0 @@
import { EncArrayBuffer } from "../models/domain/enc-array-buffer";
import { EncString } from "../models/domain/enc-string";
import { SendFileUploadDataResponse } from "../models/response/send-file-upload-data.response";
import { AttachmentUploadDataResponse } from "../vault/models/response/attachment-upload-data.response";
export abstract class FileUploadService {
uploadSendFile: (
uploadData: SendFileUploadDataResponse,
fileName: EncString,
encryptedFileData: EncArrayBuffer
) => Promise<any>;
uploadCipherAttachment: (
admin: boolean,
uploadData: AttachmentUploadDataResponse,
fileName: EncString,
encryptedFileData: EncArrayBuffer
) => Promise<any>;
}

View File

@@ -1,10 +0,0 @@
import { ImportCiphersRequest } from "../../models/request/import-ciphers.request";
import { ImportOrganizationCiphersRequest } from "../../models/request/import-organization-ciphers.request";
export abstract class ImportApiServiceAbstraction {
postImportCiphers: (request: ImportCiphersRequest) => Promise<any>;
postImportOrganizationCiphers: (
organizationId: string,
request: ImportOrganizationCiphersRequest
) => Promise<any>;
}

View File

@@ -1,19 +0,0 @@
import { ImportOption, ImportType } from "../../enums/importOptions";
import { ImportError } from "../../importers/import-error";
import { Importer } from "../../importers/importer";
export abstract class ImportService {
featuredImportOptions: readonly ImportOption[];
regularImportOptions: readonly ImportOption[];
getImportOptions: () => ImportOption[];
import: (
importer: Importer,
fileContents: string,
organizationId?: string
) => Promise<ImportError>;
getImporter: (
format: ImportType | "bitwardenpasswordprotected",
organizationId: string,
password?: string
) => Importer;
}

View File

@@ -0,0 +1,19 @@
import { OrganizationDomainRequest } from "../../services/organization-domain/requests/organization-domain.request";
import { OrganizationDomainSsoDetailsResponse } from "./responses/organization-domain-sso-details.response";
import { OrganizationDomainResponse } from "./responses/organization-domain.response";
export abstract class OrgDomainApiServiceAbstraction {
getAllByOrgId: (orgId: string) => Promise<Array<OrganizationDomainResponse>>;
getByOrgIdAndOrgDomainId: (
orgId: string,
orgDomainId: string
) => Promise<OrganizationDomainResponse>;
post: (
orgId: string,
orgDomain: OrganizationDomainRequest
) => Promise<OrganizationDomainResponse>;
verify: (orgId: string, orgDomainId: string) => Promise<OrganizationDomainResponse>;
delete: (orgId: string, orgDomainId: string) => Promise<any>;
getClaimedOrgDomainByEmail: (email: string) => Promise<OrganizationDomainSsoDetailsResponse>;
}

View File

@@ -0,0 +1,20 @@
import { Observable } from "rxjs";
import { OrganizationDomainResponse } from "./responses/organization-domain.response";
export abstract class OrgDomainServiceAbstraction {
orgDomains$: Observable<OrganizationDomainResponse[]>;
get: (orgDomainId: string) => OrganizationDomainResponse;
copyDnsTxt: (dnsTxt: string) => void;
}
// Note: this separate class is designed to hold methods that are not
// meant to be used in components (e.g., data write methods)
export abstract class OrgDomainInternalServiceAbstraction extends OrgDomainServiceAbstraction {
upsert: (orgDomains: OrganizationDomainResponse[]) => void;
replace: (orgDomains: OrganizationDomainResponse[]) => void;
clearCache: () => void;
delete: (orgDomainIds: string[]) => void;
}

View File

@@ -0,0 +1,18 @@
import { BaseResponse } from "../../../models/response/base.response";
export class OrganizationDomainSsoDetailsResponse extends BaseResponse {
id: string;
organizationIdentifier: string;
ssoAvailable: boolean;
domainName: string;
verifiedDate?: Date;
constructor(response: any) {
super(response);
this.id = this.getResponseProperty("id");
this.organizationIdentifier = this.getResponseProperty("organizationIdentifier");
this.ssoAvailable = this.getResponseProperty("ssoAvailable");
this.domainName = this.getResponseProperty("domainName");
this.verifiedDate = this.getResponseProperty("verifiedDate");
}
}

View File

@@ -0,0 +1,26 @@
import { BaseResponse } from "../../../models/response/base.response";
export class OrganizationDomainResponse extends BaseResponse {
id: string;
organizationId: string;
txt: string;
domainName: string;
creationDate: string;
nextRunDate: string;
jobRunCount: number;
verifiedDate?: string;
lastCheckedDate?: string;
constructor(response: any) {
super(response);
this.id = this.getResponseProperty("id");
this.organizationId = this.getResponseProperty("organizationId");
this.txt = this.getResponseProperty("txt");
this.domainName = this.getResponseProperty("domainName");
this.creationDate = this.getResponseProperty("creationDate");
this.nextRunDate = this.getResponseProperty("nextRunDate");
this.jobRunCount = this.getResponseProperty("jobRunCount");
this.verifiedDate = this.getResponseProperty("verifiedDate");
this.lastCheckedDate = this.getResponseProperty("lastCheckedDate");
}
}

View File

@@ -1,6 +1,6 @@
import { OrganizationUserType } from "../../../enums/organizationUserType";
import { PermissionsApi } from "../../../models/api/permissions.api";
import { SelectionReadOnlyRequest } from "../../../models/request/selection-read-only.request";
import { OrganizationUserType } from "../../../admin-console/enums/organization-user-type";
import { PermissionsApi } from "../../../admin-console/models/api/permissions.api";
import { SelectionReadOnlyRequest } from "../../../admin-console/models/request/selection-read-only.request";
export class OrganizationUserInviteRequest {
emails: string[] = [];

View File

@@ -1,6 +1,6 @@
import { OrganizationUserType } from "../../../enums/organizationUserType";
import { PermissionsApi } from "../../../models/api/permissions.api";
import { SelectionReadOnlyRequest } from "../../../models/request/selection-read-only.request";
import { OrganizationUserType } from "../../../admin-console/enums/organization-user-type";
import { PermissionsApi } from "../../../admin-console/models/api/permissions.api";
import { SelectionReadOnlyRequest } from "../../../admin-console/models/request/selection-read-only.request";
export class OrganizationUserUpdateRequest {
type: OrganizationUserType;

View File

@@ -1,9 +1,9 @@
import { OrganizationUserStatusType } from "../../../admin-console/enums/organization-user-status-type";
import { OrganizationUserType } from "../../../admin-console/enums/organization-user-type";
import { PermissionsApi } from "../../../admin-console/models/api/permissions.api";
import { SelectionReadOnlyResponse } from "../../../admin-console/models/response/selection-read-only.response";
import { KdfType } from "../../../enums/kdfType";
import { OrganizationUserStatusType } from "../../../enums/organizationUserStatusType";
import { OrganizationUserType } from "../../../enums/organizationUserType";
import { PermissionsApi } from "../../../models/api/permissions.api";
import { BaseResponse } from "../../../models/response/base.response";
import { SelectionReadOnlyResponse } from "../../../models/response/selection-read-only.response";
export class OrganizationUserResponse extends BaseResponse {
id: string;
@@ -44,6 +44,7 @@ export class OrganizationUserResponse extends BaseResponse {
export class OrganizationUserUserDetailsResponse extends OrganizationUserResponse {
name: string;
email: string;
avatarColor: string;
twoFactorEnabled: boolean;
usesKeyConnector: boolean;
@@ -51,6 +52,7 @@ export class OrganizationUserUserDetailsResponse extends OrganizationUserRespons
super(response);
this.name = this.getResponseProperty("Name");
this.email = this.getResponseProperty("Email");
this.avatarColor = this.getResponseProperty("AvatarColor");
this.twoFactorEnabled = this.getResponseProperty("TwoFactorEnabled");
this.usesKeyConnector = this.getResponseProperty("UsesKeyConnector") ?? false;
}

View File

@@ -44,4 +44,5 @@ export abstract class PlatformUtilsService {
supportsBiometric: () => Promise<boolean>;
authenticateBiometric: () => Promise<boolean>;
supportsSecureStorage: () => boolean;
getAutofillKeyboardShortcut: () => Promise<string>;
}

View File

@@ -1,4 +1,4 @@
import { SendView } from "../models/view/send.view";
import { SendView } from "../tools/send/models/view/send.view";
import { CipherView } from "../vault/models/view/cipher.view";
export abstract class SearchService {

View File

@@ -1,25 +0,0 @@
import { SendData } from "../models/data/send.data";
import { EncArrayBuffer } from "../models/domain/enc-array-buffer";
import { Send } from "../models/domain/send";
import { SymmetricCryptoKey } from "../models/domain/symmetric-crypto-key";
import { SendView } from "../models/view/send.view";
export abstract class SendService {
clearCache: () => Promise<void>;
encrypt: (
model: SendView,
file: File | ArrayBuffer,
password: string,
key?: SymmetricCryptoKey
) => Promise<[Send, EncArrayBuffer]>;
get: (id: string) => Promise<Send>;
getAll: () => Promise<Send[]>;
getAllDecrypted: () => Promise<SendView[]>;
saveWithServer: (sendData: [Send, EncArrayBuffer]) => Promise<any>;
upsert: (send: SendData | SendData[]) => Promise<any>;
replace: (sends: { [id: string]: SendData }) => Promise<any>;
clear: (userId: string) => Promise<any>;
delete: (id: string | string[]) => Promise<any>;
deleteWithServer: (id: string) => Promise<any>;
removePasswordWithServer: (id: string) => Promise<any>;
}

View File

@@ -6,5 +6,6 @@ export abstract class SettingsService {
settings$: Observable<AccountSettingsSettings>;
setEquivalentDomains: (equivalentDomains: string[][]) => Promise<any>;
getEquivalentDomains: (url: string) => string[];
clear: (userId?: string) => Promise<void>;
}

View File

@@ -1,31 +1,32 @@
import { Observable } from "rxjs";
import { CollectionData } from "../admin-console/models/data/collection.data";
import { EncryptedOrganizationKeyData } from "../admin-console/models/data/encrypted-organization-key.data";
import { OrganizationData } from "../admin-console/models/data/organization.data";
import { PolicyData } from "../admin-console/models/data/policy.data";
import { ProviderData } from "../admin-console/models/data/provider.data";
import { Policy } from "../admin-console/models/domain/policy";
import { CollectionView } from "../admin-console/models/view/collection.view";
import { EnvironmentUrls } from "../auth/models/domain/environment-urls";
import { KdfConfig } from "../auth/models/domain/kdf-config";
import { KdfType } from "../enums/kdfType";
import { ThemeType } from "../enums/themeType";
import { UriMatchType } from "../enums/uriMatchType";
import { CollectionData } from "../models/data/collection.data";
import { EncryptedOrganizationKeyData } from "../models/data/encrypted-organization-key.data";
import { EventData } from "../models/data/event.data";
import { OrganizationData } from "../models/data/organization.data";
import { PolicyData } from "../models/data/policy.data";
import { ProviderData } from "../models/data/provider.data";
import { SendData } from "../models/data/send.data";
import { ServerConfigData } from "../models/data/server-config.data";
import { Account, AccountSettingsSettings } from "../models/domain/account";
import { EncString } from "../models/domain/enc-string";
import { GeneratedPasswordHistory } from "../models/domain/generated-password-history";
import { Policy } from "../models/domain/policy";
import { StorageOptions } from "../models/domain/storage-options";
import { SymmetricCryptoKey } from "../models/domain/symmetric-crypto-key";
import { WindowState } from "../models/domain/window-state";
import { CollectionView } from "../models/view/collection.view";
import { SendView } from "../models/view/send.view";
import { GeneratedPasswordHistory } from "../tools/generator/password";
import { SendData } from "../tools/send/models/data/send.data";
import { SendView } from "../tools/send/models/view/send.view";
import { CipherData } from "../vault/models/data/cipher.data";
import { FolderData } from "../vault/models/data/folder.data";
import { LocalData } from "../vault/models/data/local.data";
import { CipherView } from "../vault/models/view/cipher.view";
import { AddEditCipherInfo } from "../vault/types/add-edit-cipher-info";
export abstract class StateService<T extends Account = Account> {
accounts$: Observable<{ [userId: string]: T }>;
@@ -39,8 +40,8 @@ export abstract class StateService<T extends Account = Account> {
getAccessToken: (options?: StorageOptions) => Promise<string>;
setAccessToken: (value: string, options?: StorageOptions) => Promise<void>;
getAddEditCipherInfo: (options?: StorageOptions) => Promise<any>;
setAddEditCipherInfo: (value: any, options?: StorageOptions) => Promise<void>;
getAddEditCipherInfo: (options?: StorageOptions) => Promise<AddEditCipherInfo>;
setAddEditCipherInfo: (value: AddEditCipherInfo, options?: StorageOptions) => Promise<void>;
getAlwaysShowDock: (options?: StorageOptions) => Promise<boolean>;
setAlwaysShowDock: (value: boolean, options?: StorageOptions) => Promise<void>;
getApiKeyClientId: (options?: StorageOptions) => Promise<string>;
@@ -119,7 +120,13 @@ export abstract class StateService<T extends Account = Account> {
value: Map<string, SymmetricCryptoKey>,
options?: StorageOptions
) => Promise<void>;
/**
* @deprecated Do not call this directly, use SendService
*/
getDecryptedSends: (options?: StorageOptions) => Promise<SendView[]>;
/**
* @deprecated Do not call this directly, use SendService
*/
setDecryptedSends: (value: SendView[], options?: StorageOptions) => Promise<void>;
getDefaultUriMatch: (options?: StorageOptions) => Promise<UriMatchType>;
setDefaultUriMatch: (value: UriMatchType, options?: StorageOptions) => Promise<void>;
@@ -236,7 +243,13 @@ export abstract class StateService<T extends Account = Account> {
setEncryptedPrivateKey: (value: string, options?: StorageOptions) => Promise<void>;
getEncryptedProviderKeys: (options?: StorageOptions) => Promise<any>;
setEncryptedProviderKeys: (value: any, options?: StorageOptions) => Promise<void>;
/**
* @deprecated Do not call this directly, use SendService
*/
getEncryptedSends: (options?: StorageOptions) => Promise<{ [id: string]: SendData }>;
/**
* @deprecated Do not call this directly, use SendService
*/
setEncryptedSends: (value: { [id: string]: SendData }, options?: StorageOptions) => Promise<void>;
getEntityId: (options?: StorageOptions) => Promise<string>;
setEntityId: (value: string, options?: StorageOptions) => Promise<void>;
@@ -244,7 +257,7 @@ export abstract class StateService<T extends Account = Account> {
setEntityType: (value: string, options?: StorageOptions) => Promise<void>;
getEnvironmentUrls: (options?: StorageOptions) => Promise<EnvironmentUrls>;
setEnvironmentUrls: (value: EnvironmentUrls, options?: StorageOptions) => Promise<void>;
getEquivalentDomains: (options?: StorageOptions) => Promise<any>;
getEquivalentDomains: (options?: StorageOptions) => Promise<string[][]>;
setEquivalentDomains: (value: string, options?: StorageOptions) => Promise<void>;
getEventCollection: (options?: StorageOptions) => Promise<EventData[]>;
setEventCollection: (value: EventData[], options?: StorageOptions) => Promise<void>;
@@ -357,4 +370,18 @@ export abstract class StateService<T extends Account = Account> {
getAvatarColor: (options?: StorageOptions) => Promise<string | null | undefined>;
setAvatarColor: (value: string, options?: StorageOptions) => Promise<void>;
getActivateAutoFillOnPageLoadFromPolicy: (
options?: StorageOptions
) => Promise<boolean | undefined>;
setActivateAutoFillOnPageLoadFromPolicy: (
value: boolean,
options?: StorageOptions
) => Promise<void>;
getSMOnboardingTasks: (
options?: StorageOptions
) => Promise<Record<string, Record<string, boolean>>>;
setSMOnboardingTasks: (
value: Record<string, Record<string, boolean>>,
options?: StorageOptions
) => Promise<void>;
}

View File

@@ -1,6 +1,6 @@
import { TreeNode } from "../../models/domain/tree-node";
import { CollectionData } from "../models/data/collection.data";
import { Collection } from "../models/domain/collection";
import { TreeNode } from "../models/domain/tree-node";
import { CollectionView } from "../models/view/collection.view";
export abstract class CollectionService {

View File

@@ -1,29 +1,30 @@
import { OrganizationApiKeyType } from "../../auth/enums/organization-api-key-type";
import { OrganizationSsoRequest } from "../../auth/models/request/organization-sso.request";
import { SecretVerificationRequest } from "../../auth/models/request/secret-verification.request";
import { ApiKeyResponse } from "../../auth/models/response/api-key.response";
import { OrganizationSsoResponse } from "../../auth/models/response/organization-sso.response";
import { ImportDirectoryRequest } from "../../models/request/import-directory.request";
import { OrganizationApiKeyRequest } from "../../models/request/organization-api-key.request";
import { OrganizationApiKeyRequest } from "../../../admin-console/models/request/organization-api-key.request";
import { OrganizationSsoRequest } from "../../../auth/models/request/organization-sso.request";
import { SecretVerificationRequest } from "../../../auth/models/request/secret-verification.request";
import { ApiKeyResponse } from "../../../auth/models/response/api-key.response";
import { OrganizationSsoResponse } from "../../../auth/models/response/organization-sso.response";
import { OrganizationSubscriptionUpdateRequest } from "../../../billing/models/request/organization-subscription-update.request";
import { OrganizationTaxInfoUpdateRequest } from "../../../billing/models/request/organization-tax-info-update.request";
import { PaymentRequest } from "../../../billing/models/request/payment.request";
import { BillingResponse } from "../../../billing/models/response/billing.response";
import { OrganizationSubscriptionResponse } from "../../../billing/models/response/organization-subscription.response";
import { PaymentResponse } from "../../../billing/models/response/payment.response";
import { TaxInfoResponse } from "../../../billing/models/response/tax-info.response";
import { ImportDirectoryRequest } from "../../../models/request/import-directory.request";
import { SeatRequest } from "../../../models/request/seat.request";
import { StorageRequest } from "../../../models/request/storage.request";
import { VerifyBankRequest } from "../../../models/request/verify-bank.request";
import { ListResponse } from "../../../models/response/list.response";
import { OrganizationApiKeyType } from "../../enums/organization-api-key-type";
import { OrganizationCreateRequest } from "../../models/request/organization-create.request";
import { OrganizationKeysRequest } from "../../models/request/organization-keys.request";
import { OrganizationSubscriptionUpdateRequest } from "../../models/request/organization-subscription-update.request";
import { OrganizationTaxInfoUpdateRequest } from "../../models/request/organization-tax-info-update.request";
import { OrganizationUpdateRequest } from "../../models/request/organization-update.request";
import { OrganizationUpgradeRequest } from "../../models/request/organization-upgrade.request";
import { PaymentRequest } from "../../models/request/payment.request";
import { SeatRequest } from "../../models/request/seat.request";
import { StorageRequest } from "../../models/request/storage.request";
import { VerifyBankRequest } from "../../models/request/verify-bank.request";
import { BillingResponse } from "../../models/response/billing.response";
import { ListResponse } from "../../models/response/list.response";
import { OrganizationEnrollSecretsManagerRequest } from "../../models/request/organization/organization-enroll-secrets-manager.request";
import { OrganizationApiKeyInformationResponse } from "../../models/response/organization-api-key-information.response";
import { OrganizationAutoEnrollStatusResponse } from "../../models/response/organization-auto-enroll-status.response";
import { OrganizationKeysResponse } from "../../models/response/organization-keys.response";
import { OrganizationSubscriptionResponse } from "../../models/response/organization-subscription.response";
import { OrganizationResponse } from "../../models/response/organization.response";
import { PaymentResponse } from "../../models/response/payment.response";
import { TaxInfoResponse } from "../../models/response/tax-info.response";
export class OrganizationApiServiceAbstraction {
get: (id: string) => Promise<OrganizationResponse>;
@@ -59,4 +60,8 @@ export class OrganizationApiServiceAbstraction {
getSso: (id: string) => Promise<OrganizationSsoResponse>;
updateSso: (id: string, request: OrganizationSsoRequest) => Promise<OrganizationSsoResponse>;
selfHostedSyncLicense: (id: string) => Promise<void>;
updateEnrollSecretsManager: (
id: string,
request: OrganizationEnrollSecretsManagerRequest
) => Promise<void>;
}

View File

@@ -1,9 +1,9 @@
import { map, Observable } from "rxjs";
import { Utils } from "../../misc/utils";
import { I18nService } from "../../../abstractions/i18n.service";
import { Utils } from "../../../misc/utils";
import { OrganizationData } from "../../models/data/organization.data";
import { Organization } from "../../models/domain/organization";
import { I18nService } from "../i18n.service";
export function canAccessVaultTab(org: Organization): boolean {
return org.canViewAssignedCollections || org.canViewAllCollections || org.canManageGroups;
@@ -32,7 +32,7 @@ export function canAccessReportingTab(org: Organization): boolean {
}
export function canAccessBillingTab(org: Organization): boolean {
return org.canManageBilling;
return org.isOwner;
}
export function canAccessOrgAdmin(org: Organization): boolean {
@@ -63,6 +63,7 @@ export function isNotProviderUser(org: Organization): boolean {
export abstract class OrganizationService {
organizations$: Observable<Organization[]>;
get$: (id: string) => Observable<Organization | undefined>;
get: (id: string) => Organization;
getByIdentifier: (identifier: string) => Organization;
getAll: (userId?: string) => Promise<Organization[]>;

View File

@@ -1,7 +1,7 @@
import { PolicyType } from "../../enums/policyType";
import { ListResponse } from "../../../models/response/list.response";
import { PolicyType } from "../../enums/policy-type";
import { MasterPasswordPolicyOptions } from "../../models/domain/master-password-policy-options";
import { PolicyRequest } from "../../models/request/policy.request";
import { ListResponse } from "../../models/response/list.response";
import { PolicyResponse } from "../../models/response/policy.response";
export class PolicyApiServiceAbstraction {

View File

@@ -1,11 +1,11 @@
import { Observable } from "rxjs";
import { PolicyType } from "../../enums/policyType";
import { ListResponse } from "../../../models/response/list.response";
import { PolicyType } from "../../enums/policy-type";
import { PolicyData } from "../../models/data/policy.data";
import { MasterPasswordPolicyOptions } from "../../models/domain/master-password-policy-options";
import { Policy } from "../../models/domain/policy";
import { ResetPasswordPolicyOptions } from "../../models/domain/reset-password-policy-options";
import { ListResponse } from "../../models/response/list.response";
import { PolicyResponse } from "../../models/response/policy.response";
export abstract class PolicyService {

View File

@@ -1,5 +1,5 @@
import { Provider } from "../../models/domain/provider";
import { ProviderData } from "../models/data/provider.data";
import { Provider } from "../models/domain/provider";
export abstract class ProviderService {
get: (id: string) => Promise<Provider>;

View File

@@ -10,4 +10,5 @@ export enum PolicyType {
ResetPassword = 8, // Allows orgs to use reset password : also can enable auto-enrollment during invite flow
MaximumVaultTimeout = 9, // Sets the maximum allowed vault timeout
DisablePersonalVaultExport = 10, // Disable personal vault export
ActivateAutofill = 11, // Activates autofill with page load on the browser extension
}

View File

@@ -1,4 +1,4 @@
import { BaseResponse } from "../response/base.response";
import { BaseResponse } from "../../../models/response/base.response";
export class PermissionsApi extends BaseResponse {
accessEventLogs: boolean;

View File

@@ -1,5 +1,5 @@
import { ScimProviderType } from "../../enums/scimProviderType";
import { BaseResponse } from "../response/base.response";
import { BaseResponse } from "../../../models/response/base.response";
import { ScimProviderType } from "../../enums/scim-provider-type";
export class ScimConfigApi extends BaseResponse {
enabled: boolean;

View File

@@ -1,6 +1,6 @@
import { OrganizationUserStatusType } from "../../enums/organizationUserStatusType";
import { OrganizationUserType } from "../../enums/organizationUserType";
import { ProductType } from "../../enums/productType";
import { ProductType } from "../../../enums/productType";
import { OrganizationUserStatusType } from "../../enums/organization-user-status-type";
import { OrganizationUserType } from "../../enums/organization-user-type";
import { PermissionsApi } from "../api/permissions.api";
import { ProfileOrganizationResponse } from "../response/profile-organization.response";
@@ -23,6 +23,7 @@ export class OrganizationData {
useCustomPermissions: boolean;
useResetPassword: boolean;
useSecretsManager: boolean;
useActivateAutofillPolicy: boolean;
selfHost: boolean;
usersGetPremium: boolean;
seats: number;
@@ -66,6 +67,7 @@ export class OrganizationData {
this.useCustomPermissions = response.useCustomPermissions;
this.useResetPassword = response.useResetPassword;
this.useSecretsManager = response.useSecretsManager;
this.useActivateAutofillPolicy = response.useActivateAutofillPolicy;
this.selfHost = response.selfHost;
this.usersGetPremium = response.usersGetPremium;
this.seats = response.seats;

View File

@@ -1,4 +1,4 @@
import { PolicyType } from "../../enums/policyType";
import { PolicyType } from "../../enums/policy-type";
import { PolicyResponse } from "../response/policy.response";
export class PolicyData {

View File

@@ -1,5 +1,5 @@
import { ProviderUserStatusType } from "../../enums/providerUserStatusType";
import { ProviderUserType } from "../../enums/providerUserType";
import { ProviderUserStatusType } from "../../enums/provider-user-status-type";
import { ProviderUserType } from "../../enums/provider-user-type";
import { ProfileProviderResponse } from "../response/profile-provider.response";
export class ProviderData {

View File

@@ -1,9 +1,8 @@
import Domain from "../../../models/domain/domain-base";
import { EncString } from "../../../models/domain/enc-string";
import { CollectionData } from "../data/collection.data";
import { CollectionView } from "../view/collection.view";
import Domain from "./domain-base";
import { EncString } from "./enc-string";
export class Collection extends Domain {
id: string;
organizationId: string;

View File

@@ -1,9 +1,8 @@
import { CryptoService } from "../../abstractions/crypto.service";
import { CryptoService } from "../../../abstractions/crypto.service";
import { EncString } from "../../../models/domain/enc-string";
import { SymmetricCryptoKey } from "../../../models/domain/symmetric-crypto-key";
import { EncryptedOrganizationKeyData } from "../data/encrypted-organization-key.data";
import { EncString } from "./enc-string";
import { SymmetricCryptoKey } from "./symmetric-crypto-key";
export abstract class BaseEncryptedOrganizationKey {
decrypt: (cryptoService: CryptoService) => Promise<SymmetricCryptoKey>;

View File

@@ -1,4 +1,4 @@
import Domain from "./domain-base";
import Domain from "../../../models/domain/domain-base";
export class MasterPasswordPolicyOptions extends Domain {
minComplexity = 0;

View File

@@ -1,8 +1,8 @@
import { Jsonify } from "type-fest";
import { OrganizationUserStatusType } from "../../enums/organizationUserStatusType";
import { OrganizationUserType } from "../../enums/organizationUserType";
import { ProductType } from "../../enums/productType";
import { ProductType } from "../../../enums/productType";
import { OrganizationUserStatusType } from "../../enums/organization-user-status-type";
import { OrganizationUserType } from "../../enums/organization-user-type";
import { PermissionsApi } from "../api/permissions.api";
import { OrganizationData } from "../data/organization.data";
@@ -25,6 +25,7 @@ export class Organization {
useCustomPermissions: boolean;
useResetPassword: boolean;
useSecretsManager: boolean;
useActivateAutofillPolicy: boolean;
selfHost: boolean;
usersGetPremium: boolean;
seats: number;
@@ -72,6 +73,7 @@ export class Organization {
this.useCustomPermissions = obj.useCustomPermissions;
this.useResetPassword = obj.useResetPassword;
this.useSecretsManager = obj.useSecretsManager;
this.useActivateAutofillPolicy = obj.useActivateAutofillPolicy;
this.selfHost = obj.selfHost;
this.usersGetPremium = obj.usersGetPremium;
this.seats = obj.seats;
@@ -172,6 +174,10 @@ export class Organization {
return (this.isAdmin || this.permissions.manageSso) && this.useSso;
}
get canManageDomainVerification() {
return (this.isAdmin || this.permissions.manageSso) && this.useSso;
}
get canManageScim() {
return (this.isAdmin || this.permissions.manageScim) && this.useScim;
}
@@ -204,6 +210,11 @@ export class Organization {
return this.useSecretsManager && this.accessSecretsManager;
}
get isFreeOrg() {
// return true if organization needs to be upgraded from a free org
return !this.useTotp;
}
static fromJSON(json: Jsonify<Organization>) {
if (json == null) {
return null;

View File

@@ -1,4 +1,4 @@
import Domain from "./domain-base";
import Domain from "../../../models/domain/domain-base";
export class PasswordGeneratorPolicyOptions extends Domain {
defaultType = "";

View File

@@ -1,8 +1,7 @@
import { PolicyType } from "../../enums/policyType";
import Domain from "../../../models/domain/domain-base";
import { PolicyType } from "../../enums/policy-type";
import { PolicyData } from "../data/policy.data";
import Domain from "./domain-base";
export class Policy extends Domain {
id: string;
organizationId: string;

View File

@@ -1,4 +1,4 @@
import Domain from "./domain-base";
import Domain from "../../../models/domain/domain-base";
export class ResetPasswordPolicyOptions extends Domain {
autoEnrollEnabled = false;

View File

@@ -0,0 +1,6 @@
import { SecretVerificationRequest } from "../../../auth/models/request/secret-verification.request";
import { OrganizationApiKeyType } from "../../enums/organization-api-key-type";
export class OrganizationApiKeyRequest extends SecretVerificationRequest {
type: OrganizationApiKeyType = OrganizationApiKeyType.Default;
}

View File

@@ -1,6 +1,6 @@
import { OrganizationConnectionType } from "../../enums/organizationConnectionType";
import { BillingSyncConfigRequest } from "../../../billing/models/request/billing-sync-config.request";
import { OrganizationConnectionType } from "../../enums/organization-connection-type";
import { BillingSyncConfigRequest } from "./billing-sync-config.request";
import { ScimConfigRequest } from "./scim-config.request";
/**API request config types for OrganizationConnectionRequest */

View File

@@ -1,5 +1,5 @@
import { PaymentMethodType } from "../../enums/paymentMethodType";
import { PlanType } from "../../enums/planType";
import { PaymentMethodType } from "../../../billing/enums/payment-method-type";
import { PlanType } from "../../../billing/enums/plan-type";
import { OrganizationKeysRequest } from "./organization-keys.request";

View File

@@ -1,4 +1,4 @@
import { KeysRequest } from "./keys.request";
import { KeysRequest } from "../../../models/request/keys.request";
export class OrganizationKeysRequest extends KeysRequest {
constructor(publicKey: string, encryptedPrivateKey: string) {

View File

@@ -1,4 +1,4 @@
import { PlanType } from "../../enums/planType";
import { PlanType } from "../../../billing/enums/plan-type";
import { OrganizationKeysRequest } from "./organization-keys.request";

View File

@@ -0,0 +1,3 @@
export class OrganizationEnrollSecretsManagerRequest {
enabled: boolean;
}

View File

@@ -1,4 +1,4 @@
import { PlanSponsorshipType } from "../../../enums/planSponsorshipType";
import { PlanSponsorshipType } from "../../../../billing/enums/plan-sponsorship-type";
export class OrganizationSponsorshipCreateRequest {
sponsoredEmail: string;

View File

@@ -1,4 +1,4 @@
import { PlanSponsorshipType } from "../../../enums/planSponsorshipType";
import { PlanSponsorshipType } from "../../../../billing/enums/plan-sponsorship-type";
export class OrganizationSponsorshipRedeemRequest {
planSponsorshipType: PlanSponsorshipType;

View File

@@ -1,4 +1,4 @@
import { PolicyType } from "../../enums/policyType";
import { PolicyType } from "../../enums/policy-type";
export class PolicyRequest {
type: PolicyType;

View File

@@ -1,4 +1,4 @@
import { OrganizationCreateRequest } from "../organization-create.request";
import { OrganizationCreateRequest } from "../../../models/request/organization-create.request";
export class ProviderOrganizationCreateRequest {
constructor(

View File

@@ -1,4 +1,4 @@
import { ProviderUserType } from "../../../enums/providerUserType";
import { ProviderUserType } from "../../../enums/provider-user-type";
export class ProviderUserInviteRequest {
emails: string[] = [];

View File

@@ -1,4 +1,4 @@
import { ProviderUserType } from "../../../enums/providerUserType";
import { ProviderUserType } from "../../../enums/provider-user-type";
export class ProviderUserUpdateRequest {
type: ProviderUserType;

View File

@@ -1,4 +1,4 @@
import { ScimProviderType } from "../../enums/scimProviderType";
import { ScimProviderType } from "../../enums/scim-provider-type";
export class ScimConfigRequest {
constructor(private enabled: boolean, private scimProvider: ScimProviderType = null) {}

View File

@@ -1,4 +1,5 @@
import { BaseResponse } from "./base.response";
import { BaseResponse } from "../../../models/response/base.response";
import { SelectionReadOnlyResponse } from "./selection-read-only.response";
export class CollectionResponse extends BaseResponse {

View File

@@ -1,6 +1,5 @@
import { OrganizationApiKeyType } from "../../auth/enums/organization-api-key-type";
import { BaseResponse } from "./base.response";
import { BaseResponse } from "../../../models/response/base.response";
import { OrganizationApiKeyType } from "../../enums/organization-api-key-type";
export class OrganizationApiKeyInformationResponse extends BaseResponse {
keyType: OrganizationApiKeyType;

View File

@@ -1,4 +1,4 @@
import { BaseResponse } from "./base.response";
import { BaseResponse } from "../../../models/response/base.response";
export class OrganizationAutoEnrollStatusResponse extends BaseResponse {
id: string;

View File

@@ -1,9 +1,8 @@
import { OrganizationConnectionType } from "../../enums/organizationConnectionType";
import { BillingSyncConfigApi } from "../api/billing-sync-config.api";
import { BillingSyncConfigApi } from "../../../billing/models/api/billing-sync-config.api";
import { BaseResponse } from "../../../models/response/base.response";
import { OrganizationConnectionType } from "../../enums/organization-connection-type";
import { ScimConfigApi } from "../api/scim-config.api";
import { BaseResponse } from "./base.response";
/**API response config types for OrganizationConnectionResponse */
export type OrganizationConnectionConfigApis = BillingSyncConfigApi | ScimConfigApi;

View File

@@ -1,6 +1,6 @@
import { CipherResponse } from "../../vault/models/response/cipher.response";
import { BaseResponse } from "../../../models/response/base.response";
import { CipherResponse } from "../../../vault/models/response/cipher.response";
import { BaseResponse } from "./base.response";
import { CollectionResponse } from "./collection.response";
export class OrganizationExportResponse extends BaseResponse {

View File

@@ -1,4 +1,4 @@
import { KeysResponse } from "./keys.response";
import { KeysResponse } from "../../../models/response/keys.response";
export class OrganizationKeysResponse extends KeysResponse {
constructor(response: any) {

View File

@@ -1,4 +1,4 @@
import { BaseResponse } from "./base.response";
import { BaseResponse } from "../../../models/response/base.response";
export class OrganizationSponsorshipSyncStatusResponse extends BaseResponse {
lastSyncDate?: Date;

View File

@@ -1,7 +1,6 @@
import { PlanType } from "../../enums/planType";
import { BaseResponse } from "./base.response";
import { PlanResponse } from "./plan.response";
import { PlanType } from "../../../billing/enums/plan-type";
import { PlanResponse } from "../../../billing/models/response/plan.response";
import { BaseResponse } from "../../../models/response/base.response";
export class OrganizationResponse extends BaseResponse {
id: string;
@@ -26,6 +25,7 @@ export class OrganizationResponse extends BaseResponse {
use2fa: boolean;
useApi: boolean;
useResetPassword: boolean;
useSecretsManager: boolean;
hasPublicAndPrivateKeys: boolean;
constructor(response: any) {
@@ -53,6 +53,7 @@ export class OrganizationResponse extends BaseResponse {
this.use2fa = this.getResponseProperty("Use2fa");
this.useApi = this.getResponseProperty("UseApi");
this.useResetPassword = this.getResponseProperty("UseResetPassword");
this.useSecretsManager = this.getResponseProperty("UseSecretsManager");
this.hasPublicAndPrivateKeys = this.getResponseProperty("HasPublicAndPrivateKeys");
}
}

View File

@@ -1,6 +1,5 @@
import { PolicyType } from "../../enums/policyType";
import { BaseResponse } from "./base.response";
import { BaseResponse } from "../../../models/response/base.response";
import { PolicyType } from "../../enums/policy-type";
export class PolicyResponse extends BaseResponse {
id: string;

View File

@@ -1,10 +1,9 @@
import { OrganizationUserStatusType } from "../../enums/organizationUserStatusType";
import { OrganizationUserType } from "../../enums/organizationUserType";
import { ProductType } from "../../enums/productType";
import { ProductType } from "../../../enums/productType";
import { BaseResponse } from "../../../models/response/base.response";
import { OrganizationUserStatusType } from "../../enums/organization-user-status-type";
import { OrganizationUserType } from "../../enums/organization-user-type";
import { PermissionsApi } from "../api/permissions.api";
import { BaseResponse } from "./base.response";
export class ProfileOrganizationResponse extends BaseResponse {
id: string;
name: string;
@@ -21,6 +20,7 @@ export class ProfileOrganizationResponse extends BaseResponse {
useCustomPermissions: boolean;
useResetPassword: boolean;
useSecretsManager: boolean;
useActivateAutofillPolicy: boolean;
selfHost: boolean;
usersGetPremium: boolean;
seats: number;
@@ -65,6 +65,7 @@ export class ProfileOrganizationResponse extends BaseResponse {
this.useCustomPermissions = this.getResponseProperty("UseCustomPermissions") ?? false;
this.useResetPassword = this.getResponseProperty("UseResetPassword");
this.useSecretsManager = this.getResponseProperty("UseSecretsManager");
this.useActivateAutofillPolicy = this.getResponseProperty("UseActivateAutofillPolicy");
this.selfHost = this.getResponseProperty("SelfHost");
this.usersGetPremium = this.getResponseProperty("UsersGetPremium");
this.seats = this.getResponseProperty("Seats");

View File

@@ -1,9 +1,8 @@
import { ProviderUserStatusType } from "../../enums/providerUserStatusType";
import { ProviderUserType } from "../../enums/providerUserType";
import { BaseResponse } from "../../../models/response/base.response";
import { ProviderUserStatusType } from "../../enums/provider-user-status-type";
import { ProviderUserType } from "../../enums/provider-user-type";
import { PermissionsApi } from "../api/permissions.api";
import { BaseResponse } from "./base.response";
export class ProfileProviderResponse extends BaseResponse {
id: string;
name: string;

View File

@@ -1,4 +1,4 @@
import { BaseResponse } from "../base.response";
import { BaseResponse } from "../../../../models/response/base.response";
export class ProviderOrganizationResponse extends BaseResponse {
id: string;

View File

@@ -1,3 +1,3 @@
import { OrganizationUserBulkPublicKeyResponse } from "../../../abstractions/organization-user/responses";
import { OrganizationUserBulkPublicKeyResponse } from "../../../../abstractions/organization-user/responses";
export class ProviderUserBulkPublicKeyResponse extends OrganizationUserBulkPublicKeyResponse {}

View File

@@ -1,4 +1,4 @@
import { BaseResponse } from "../base.response";
import { BaseResponse } from "../../../../models/response/base.response";
export class ProviderUserBulkResponse extends BaseResponse {
id: string;

View File

@@ -1,7 +1,7 @@
import { ProviderUserStatusType } from "../../../enums/providerUserStatusType";
import { ProviderUserType } from "../../../enums/providerUserType";
import { BaseResponse } from "../../../../models/response/base.response";
import { ProviderUserStatusType } from "../../../enums/provider-user-status-type";
import { ProviderUserType } from "../../../enums/provider-user-type";
import { PermissionsApi } from "../../api/permissions.api";
import { BaseResponse } from "../base.response";
export class ProviderUserResponse extends BaseResponse {
id: string;

View File

@@ -1,4 +1,4 @@
import { BaseResponse } from "../base.response";
import { BaseResponse } from "../../../../models/response/base.response";
export class ProviderResponse extends BaseResponse {
id: string;

View File

@@ -1,4 +1,4 @@
import { BaseResponse } from "./base.response";
import { BaseResponse } from "../../../models/response/base.response";
export class SelectionReadOnlyResponse extends BaseResponse {
id: string;

View File

@@ -1,9 +1,8 @@
import { ITreeNodeObject } from "../../../models/domain/tree-node";
import { View } from "../../../models/view/view";
import { Collection } from "../domain/collection";
import { ITreeNodeObject } from "../domain/tree-node";
import { CollectionAccessDetailsResponse } from "../response/collection.response";
import { View } from "./view";
export class CollectionView implements View, ITreeNodeObject {
id: string = null;
organizationId: string = null;

View File

@@ -1,12 +1,12 @@
import { CryptoService } from "../../abstractions/crypto.service";
import { I18nService } from "../../abstractions/i18n.service";
import { StateService } from "../../abstractions/state.service";
import { ServiceUtils } from "../../misc/serviceUtils";
import { Utils } from "../../misc/utils";
import { TreeNode } from "../../models/domain/tree-node";
import { CollectionService as CollectionServiceAbstraction } from "../abstractions/collection.service";
import { CryptoService } from "../abstractions/crypto.service";
import { I18nService } from "../abstractions/i18n.service";
import { StateService } from "../abstractions/state.service";
import { ServiceUtils } from "../misc/serviceUtils";
import { Utils } from "../misc/utils";
import { CollectionData } from "../models/data/collection.data";
import { Collection } from "../models/domain/collection";
import { TreeNode } from "../models/domain/tree-node";
import { CollectionView } from "../models/view/collection.view";
const NestingDelimiter = "/";

View File

@@ -1,32 +1,33 @@
import { ApiService } from "../../abstractions/api.service";
import { ApiService } from "../../../abstractions/api.service";
import { OrganizationApiKeyRequest } from "../../../admin-console/models/request/organization-api-key.request";
import { OrganizationSsoRequest } from "../../../auth/models/request/organization-sso.request";
import { SecretVerificationRequest } from "../../../auth/models/request/secret-verification.request";
import { ApiKeyResponse } from "../../../auth/models/response/api-key.response";
import { OrganizationSsoResponse } from "../../../auth/models/response/organization-sso.response";
import { OrganizationSubscriptionUpdateRequest } from "../../../billing/models/request/organization-subscription-update.request";
import { OrganizationTaxInfoUpdateRequest } from "../../../billing/models/request/organization-tax-info-update.request";
import { PaymentRequest } from "../../../billing/models/request/payment.request";
import { BillingResponse } from "../../../billing/models/response/billing.response";
import { OrganizationSubscriptionResponse } from "../../../billing/models/response/organization-subscription.response";
import { PaymentResponse } from "../../../billing/models/response/payment.response";
import { TaxInfoResponse } from "../../../billing/models/response/tax-info.response";
import { ImportDirectoryRequest } from "../../../models/request/import-directory.request";
import { SeatRequest } from "../../../models/request/seat.request";
import { StorageRequest } from "../../../models/request/storage.request";
import { VerifyBankRequest } from "../../../models/request/verify-bank.request";
import { ListResponse } from "../../../models/response/list.response";
import { SyncService } from "../../../vault/abstractions/sync/sync.service.abstraction";
import { OrganizationApiServiceAbstraction } from "../../abstractions/organization/organization-api.service.abstraction";
import { OrganizationApiKeyType } from "../../auth/enums/organization-api-key-type";
import { OrganizationSsoRequest } from "../../auth/models/request/organization-sso.request";
import { SecretVerificationRequest } from "../../auth/models/request/secret-verification.request";
import { ApiKeyResponse } from "../../auth/models/response/api-key.response";
import { OrganizationSsoResponse } from "../../auth/models/response/organization-sso.response";
import { ImportDirectoryRequest } from "../../models/request/import-directory.request";
import { OrganizationApiKeyRequest } from "../../models/request/organization-api-key.request";
import { OrganizationApiKeyType } from "../../enums/organization-api-key-type";
import { OrganizationCreateRequest } from "../../models/request/organization-create.request";
import { OrganizationKeysRequest } from "../../models/request/organization-keys.request";
import { OrganizationSubscriptionUpdateRequest } from "../../models/request/organization-subscription-update.request";
import { OrganizationTaxInfoUpdateRequest } from "../../models/request/organization-tax-info-update.request";
import { OrganizationUpdateRequest } from "../../models/request/organization-update.request";
import { OrganizationUpgradeRequest } from "../../models/request/organization-upgrade.request";
import { PaymentRequest } from "../../models/request/payment.request";
import { SeatRequest } from "../../models/request/seat.request";
import { StorageRequest } from "../../models/request/storage.request";
import { VerifyBankRequest } from "../../models/request/verify-bank.request";
import { BillingResponse } from "../../models/response/billing.response";
import { ListResponse } from "../../models/response/list.response";
import { OrganizationEnrollSecretsManagerRequest } from "../../models/request/organization/organization-enroll-secrets-manager.request";
import { OrganizationApiKeyInformationResponse } from "../../models/response/organization-api-key-information.response";
import { OrganizationAutoEnrollStatusResponse } from "../../models/response/organization-auto-enroll-status.response";
import { OrganizationKeysResponse } from "../../models/response/organization-keys.response";
import { OrganizationSubscriptionResponse } from "../../models/response/organization-subscription.response";
import { OrganizationResponse } from "../../models/response/organization.response";
import { PaymentResponse } from "../../models/response/payment.response";
import { TaxInfoResponse } from "../../models/response/tax-info.response";
import { SyncService } from "../../vault/abstractions/sync/sync.service.abstraction";
export class OrganizationApiService implements OrganizationApiServiceAbstraction {
constructor(private apiService: ApiService, private syncService: SyncService) {}
@@ -292,4 +293,14 @@ export class OrganizationApiService implements OrganizationApiServiceAbstraction
false
);
}
async updateEnrollSecretsManager(id: string, request: OrganizationEnrollSecretsManagerRequest) {
await this.apiService.send(
"POST",
"/organizations/" + id + "/enroll-secrets-manager",
request,
true,
true
);
}
}

View File

@@ -1,7 +1,7 @@
import { BehaviorSubject, concatMap } from "rxjs";
import { BehaviorSubject, concatMap, map, Observable } from "rxjs";
import { StateService } from "../../../abstractions/state.service";
import { InternalOrganizationService as InternalOrganizationServiceAbstraction } from "../../abstractions/organization/organization.service.abstraction";
import { StateService } from "../../abstractions/state.service";
import { OrganizationData } from "../../models/data/organization.data";
import { Organization } from "../../models/domain/organization";
@@ -26,6 +26,10 @@ export class OrganizationService implements InternalOrganizationServiceAbstracti
.subscribe();
}
get$(id: string): Observable<Organization | undefined> {
return this.organizations$.pipe(map((orgs) => orgs.find((o) => o.id === id)));
}
async getAll(userId?: string): Promise<Organization[]> {
const organizationsMap = await this.stateService.getOrganizations({ userId: userId });
return Object.values(organizationsMap || {}).map((o) => new Organization(o));

View File

@@ -1,15 +1,15 @@
import { firstValueFrom } from "rxjs";
import { ApiService } from "../../abstractions/api.service";
import { ApiService } from "../../../abstractions/api.service";
import { StateService } from "../../../abstractions/state.service";
import { Utils } from "../../../misc/utils";
import { ListResponse } from "../../../models/response/list.response";
import { PolicyApiServiceAbstraction } from "../../abstractions/policy/policy-api.service.abstraction";
import { InternalPolicyService } from "../../abstractions/policy/policy.service.abstraction";
import { StateService } from "../../abstractions/state.service";
import { PolicyType } from "../../enums/policyType";
import { Utils } from "../../misc/utils";
import { PolicyType } from "../../enums/policy-type";
import { PolicyData } from "../../models/data/policy.data";
import { MasterPasswordPolicyOptions } from "../../models/domain/master-password-policy-options";
import { PolicyRequest } from "../../models/request/policy.request";
import { ListResponse } from "../../models/response/list.response";
import { PolicyResponse } from "../../models/response/policy.response";
export class PolicyApiService implements PolicyApiServiceAbstraction {

View File

@@ -1,18 +1,18 @@
import { of, concatMap, BehaviorSubject, Observable, map } from "rxjs";
import { StateService } from "../../../abstractions/state.service";
import { Utils } from "../../../misc/utils";
import { ListResponse } from "../../../models/response/list.response";
import { OrganizationService } from "../../abstractions/organization/organization.service.abstraction";
import { InternalPolicyService as InternalPolicyServiceAbstraction } from "../../abstractions/policy/policy.service.abstraction";
import { StateService } from "../../abstractions/state.service";
import { OrganizationUserStatusType } from "../../enums/organizationUserStatusType";
import { OrganizationUserType } from "../../enums/organizationUserType";
import { PolicyType } from "../../enums/policyType";
import { Utils } from "../../misc/utils";
import { OrganizationUserStatusType } from "../../enums/organization-user-status-type";
import { OrganizationUserType } from "../../enums/organization-user-type";
import { PolicyType } from "../../enums/policy-type";
import { PolicyData } from "../../models/data/policy.data";
import { MasterPasswordPolicyOptions } from "../../models/domain/master-password-policy-options";
import { Organization } from "../../models/domain/organization";
import { Policy } from "../../models/domain/policy";
import { ResetPasswordPolicyOptions } from "../../models/domain/reset-password-policy-options";
import { ListResponse } from "../../models/response/list.response";
import { PolicyResponse } from "../../models/response/policy.response";
export class PolicyService implements InternalPolicyServiceAbstraction {
@@ -21,7 +21,7 @@ export class PolicyService implements InternalPolicyServiceAbstraction {
policies$ = this._policies.asObservable();
constructor(
private stateService: StateService,
protected stateService: StateService,
private organizationService: OrganizationService
) {
this.stateService.activeAccountUnlocked$

View File

@@ -1,7 +1,7 @@
import { StateService } from "../../abstractions/state.service";
import { Provider } from "../../models/domain/provider";
import { ProviderService as ProviderServiceAbstraction } from "../abstractions/provider.service";
import { StateService } from "../abstractions/state.service";
import { ProviderData } from "../models/data/provider.data";
import { Provider } from "../models/domain/provider";
export class ProviderService implements ProviderServiceAbstraction {
constructor(private stateService: StateService) {}

View File

@@ -1,4 +1,4 @@
import { Organization } from "../../models/domain/organization";
import { Organization } from "../../admin-console/models/domain/organization";
import { IdentityTokenResponse } from "../models/response/identity-token.response";
export abstract class KeyConnectorService {

View File

@@ -6,7 +6,6 @@ export class PasswordlessCreateAuthRequest {
readonly deviceIdentifier: string,
readonly publicKey: string,
readonly type: AuthRequestType,
readonly accessCode: string,
readonly fingerprintPhrase: string
readonly accessCode: string
) {}
}

View File

@@ -12,7 +12,6 @@ export class AuthRequestResponse extends BaseResponse {
masterPasswordHash: string;
creationDate: string;
requestApproved?: boolean;
requestFingerprint?: string;
responseDate?: string;
isAnswered: boolean;
isExpired: boolean;
@@ -27,7 +26,6 @@ export class AuthRequestResponse extends BaseResponse {
this.masterPasswordHash = this.getResponseProperty("MasterPasswordHash");
this.creationDate = this.getResponseProperty("CreationDate");
this.requestApproved = this.getResponseProperty("RequestApproved");
this.requestFingerprint = this.getResponseProperty("RequestFingerprint");
this.responseDate = this.getResponseProperty("ResponseDate");
const requestDate = new Date(this.creationDate);

View File

@@ -6,9 +6,12 @@ import {
Saml2SigningBehavior,
SsoType,
} from "../../enums/sso";
import { SsoConfigApi } from "../api/sso-config.api";
import { OrganizationSsoResponse } from "../response/organization-sso.response";
export class SsoConfigView extends View {
enabled: boolean;
ssoIdentifier: string;
configType: SsoType;
keyConnectorEnabled: boolean;
@@ -48,55 +51,63 @@ export class SsoConfigView extends View {
idpWantAuthnRequestsSigned: boolean;
};
constructor(api: SsoConfigApi) {
constructor(orgSsoResponse: OrganizationSsoResponse) {
super();
if (api == null) {
if (orgSsoResponse == null) {
return;
}
this.configType = api.configType;
this.enabled = orgSsoResponse.enabled;
this.ssoIdentifier = orgSsoResponse.identifier;
this.keyConnectorEnabled = api.keyConnectorEnabled;
this.keyConnectorUrl = api.keyConnectorUrl;
if (orgSsoResponse.data == null) {
return;
}
this.configType = orgSsoResponse.data.configType;
this.keyConnectorEnabled = orgSsoResponse.data.keyConnectorEnabled;
this.keyConnectorUrl = orgSsoResponse.data.keyConnectorUrl;
if (this.configType === SsoType.OpenIdConnect) {
this.openId = {
authority: api.authority,
clientId: api.clientId,
clientSecret: api.clientSecret,
metadataAddress: api.metadataAddress,
redirectBehavior: api.redirectBehavior,
getClaimsFromUserInfoEndpoint: api.getClaimsFromUserInfoEndpoint,
additionalScopes: api.additionalScopes,
additionalUserIdClaimTypes: api.additionalUserIdClaimTypes,
additionalEmailClaimTypes: api.additionalEmailClaimTypes,
additionalNameClaimTypes: api.additionalNameClaimTypes,
acrValues: api.acrValues,
expectedReturnAcrValue: api.expectedReturnAcrValue,
authority: orgSsoResponse.data.authority,
clientId: orgSsoResponse.data.clientId,
clientSecret: orgSsoResponse.data.clientSecret,
metadataAddress: orgSsoResponse.data.metadataAddress,
redirectBehavior: orgSsoResponse.data.redirectBehavior,
getClaimsFromUserInfoEndpoint: orgSsoResponse.data.getClaimsFromUserInfoEndpoint,
additionalScopes: orgSsoResponse.data.additionalScopes,
additionalUserIdClaimTypes: orgSsoResponse.data.additionalUserIdClaimTypes,
additionalEmailClaimTypes: orgSsoResponse.data.additionalEmailClaimTypes,
additionalNameClaimTypes: orgSsoResponse.data.additionalNameClaimTypes,
acrValues: orgSsoResponse.data.acrValues,
expectedReturnAcrValue: orgSsoResponse.data.expectedReturnAcrValue,
};
} else if (this.configType === SsoType.Saml2) {
this.saml = {
spNameIdFormat: api.spNameIdFormat,
spOutboundSigningAlgorithm: api.spOutboundSigningAlgorithm,
spSigningBehavior: api.spSigningBehavior,
spMinIncomingSigningAlgorithm: api.spMinIncomingSigningAlgorithm,
spWantAssertionsSigned: api.spWantAssertionsSigned,
spValidateCertificates: api.spValidateCertificates,
spNameIdFormat: orgSsoResponse.data.spNameIdFormat,
spOutboundSigningAlgorithm: orgSsoResponse.data.spOutboundSigningAlgorithm,
spSigningBehavior: orgSsoResponse.data.spSigningBehavior,
spMinIncomingSigningAlgorithm: orgSsoResponse.data.spMinIncomingSigningAlgorithm,
spWantAssertionsSigned: orgSsoResponse.data.spWantAssertionsSigned,
spValidateCertificates: orgSsoResponse.data.spValidateCertificates,
idpEntityId: api.idpEntityId,
idpBindingType: api.idpBindingType,
idpSingleSignOnServiceUrl: api.idpSingleSignOnServiceUrl,
idpSingleLogoutServiceUrl: api.idpSingleLogoutServiceUrl,
idpX509PublicCert: api.idpX509PublicCert,
idpOutboundSigningAlgorithm: api.idpOutboundSigningAlgorithm,
idpAllowUnsolicitedAuthnResponse: api.idpAllowUnsolicitedAuthnResponse,
idpWantAuthnRequestsSigned: api.idpWantAuthnRequestsSigned,
idpEntityId: orgSsoResponse.data.idpEntityId,
idpBindingType: orgSsoResponse.data.idpBindingType,
idpSingleSignOnServiceUrl: orgSsoResponse.data.idpSingleSignOnServiceUrl,
idpSingleLogoutServiceUrl: orgSsoResponse.data.idpSingleLogoutServiceUrl,
idpX509PublicCert: orgSsoResponse.data.idpX509PublicCert,
idpOutboundSigningAlgorithm: orgSsoResponse.data.idpOutboundSigningAlgorithm,
idpAllowUnsolicitedAuthnResponse: orgSsoResponse.data.idpAllowUnsolicitedAuthnResponse,
idpWantAuthnRequestsSigned: orgSsoResponse.data.idpWantAuthnRequestsSigned,
// Value is inverted in the view model (allow instead of disable)
idpAllowOutboundLogoutRequests:
api.idpDisableOutboundLogoutRequests == null
orgSsoResponse.data.idpDisableOutboundLogoutRequests == null
? null
: !api.idpDisableOutboundLogoutRequests,
: !orgSsoResponse.data.idpDisableOutboundLogoutRequests,
};
}
}

View File

@@ -2,9 +2,9 @@ import { ApiService } from "../../abstractions/api.service";
import { CryptoService } from "../../abstractions/crypto.service";
import { CryptoFunctionService } from "../../abstractions/cryptoFunction.service";
import { LogService } from "../../abstractions/log.service";
import { OrganizationService } from "../../abstractions/organization/organization.service.abstraction";
import { StateService } from "../../abstractions/state.service";
import { OrganizationUserType } from "../../enums/organizationUserType";
import { OrganizationService } from "../../admin-console/abstractions/organization/organization.service.abstraction";
import { OrganizationUserType } from "../../admin-console/enums/organization-user-type";
import { Utils } from "../../misc/utils";
import { SymmetricCryptoKey } from "../../models/domain/symmetric-crypto-key";
import { KeysRequest } from "../../models/request/keys.request";

Some files were not shown because too many files have changed in this diff Show More