1
0
mirror of https://github.com/bitwarden/browser synced 2025-12-31 15:43:28 +00:00
Files
browser/apps/web/src/app/core/event.service.ts
cd-bitwarden ad145fc4ff [SM-1274] Add Project Events to the Log List in Admin Console (#15442)
* Adding enums for additional event logs for secrets

* updating messages

* Updating messages to be consistent for logs

* Displaying project logs, and fixing search query param searching in projects list, having deleted log for secrets and projects not show as a link

* Viewing secret and project event logs in event modal, adding to the context menu for secrets and projects the ability to view the logs if user has permission. Restricting logs to SM projs and Secs if the logged in user has event log access but not SM access.

* lint

* Lint Fixes

* fix to messages file

* fixing lint

* Bug fix, make sure event logs related to service accounts are still links that take you to the object

* removing unused import
2025-08-20 10:45:58 -04:00

759 lines
30 KiB
TypeScript

// FIXME: Update this file to be type safe and remove this and next line
// @ts-strict-ignore
import { Injectable } from "@angular/core";
import { switchMap } from "rxjs";
import { PolicyService } from "@bitwarden/common/admin-console/abstractions/policy/policy.service.abstraction";
import { PolicyType } from "@bitwarden/common/admin-console/enums";
import { Policy } from "@bitwarden/common/admin-console/models/domain/policy";
import { AccountService } from "@bitwarden/common/auth/abstractions/account.service";
import { getUserId } from "@bitwarden/common/auth/services/account.service";
import { DeviceType, EventType } from "@bitwarden/common/enums";
import { EventResponse } from "@bitwarden/common/models/response/event.response";
import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.service";
@Injectable()
export class EventService {
private policies: Policy[];
constructor(
private i18nService: I18nService,
policyService: PolicyService,
accountService: AccountService,
) {
accountService.activeAccount$
.pipe(
getUserId,
switchMap((userId) => policyService.policies$(userId)),
)
.subscribe((policies) => {
this.policies = policies;
});
}
getDefaultDateFilters() {
const d = new Date();
const end = new Date(d.getFullYear(), d.getMonth(), d.getDate(), 23, 59);
d.setDate(d.getDate() - 30);
const start = new Date(d.getFullYear(), d.getMonth(), d.getDate(), 0, 0);
return [this.toDateTimeLocalString(start), this.toDateTimeLocalString(end)];
}
formatDateFilters(filterStart: string, filterEnd: string) {
const start: Date = new Date(filterStart);
const end: Date = new Date(filterEnd + ":59.999");
if (isNaN(start.getTime()) || isNaN(end.getTime()) || end < start) {
throw new Error("Invalid date range.");
}
return [start.toISOString(), end.toISOString()];
}
async getEventInfo(ev: EventResponse, options = new EventOptions()): Promise<EventInfo> {
const appInfo = this.getAppInfo(ev);
const { message, humanReadableMessage } = await this.getEventMessage(ev, options);
return {
message: message,
humanReadableMessage: humanReadableMessage,
appIcon: appInfo[0],
appName: appInfo[1],
};
}
private async getEventMessage(ev: EventResponse, options: EventOptions) {
let msg = "";
let humanReadableMsg = "";
switch (ev.type) {
// User
case EventType.User_LoggedIn:
msg = humanReadableMsg = this.i18nService.t("loggedIn");
break;
case EventType.User_ChangedPassword:
msg = humanReadableMsg = this.i18nService.t("changedPassword");
break;
case EventType.User_Updated2fa:
msg = humanReadableMsg = this.i18nService.t("enabledUpdated2fa");
break;
case EventType.User_Disabled2fa:
msg = humanReadableMsg = this.i18nService.t("disabled2fa");
break;
case EventType.User_Recovered2fa:
msg = humanReadableMsg = this.i18nService.t("recovered2fa");
break;
case EventType.User_FailedLogIn:
msg = humanReadableMsg = this.i18nService.t("failedLogin");
break;
case EventType.User_FailedLogIn2fa:
msg = humanReadableMsg = this.i18nService.t("failedLogin2fa");
break;
case EventType.User_ClientExportedVault:
msg = humanReadableMsg = this.i18nService.t("exportedVault");
break;
case EventType.User_UpdatedTempPassword:
msg = humanReadableMsg = this.i18nService.t("updatedTempPassword");
break;
case EventType.User_MigratedKeyToKeyConnector:
msg = humanReadableMsg = this.i18nService.t("migratedKeyConnector");
break;
case EventType.User_RequestedDeviceApproval:
msg = humanReadableMsg = this.i18nService.t("requestedDeviceApproval");
break;
case EventType.User_TdeOffboardingPasswordSet:
msg = humanReadableMsg = this.i18nService.t("tdeOffboardingPasswordSet");
break;
// Cipher
case EventType.Cipher_Created:
msg = this.i18nService.t("createdItemId", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t("createdItemId", this.getShortId(ev.cipherId));
break;
case EventType.Cipher_Updated:
msg = this.i18nService.t("editedItemId", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t("editedItemId", this.getShortId(ev.cipherId));
break;
case EventType.Cipher_Deleted:
msg = this.i18nService.t("permanentlyDeletedItemId", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t(
"permanentlyDeletedItemId",
this.getShortId(ev.cipherId),
);
break;
case EventType.Cipher_SoftDeleted:
msg = this.i18nService.t("deletedItemId", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t("deletedItemId", this.getShortId(ev.cipherId));
break;
case EventType.Cipher_Restored:
msg = this.i18nService.t("restoredItemId", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t("restoredItemId", this.formatCipherId(ev, options));
break;
case EventType.Cipher_AttachmentCreated:
msg = this.i18nService.t("createdAttachmentForItem", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t(
"createdAttachmentForItem",
this.getShortId(ev.cipherId),
);
break;
case EventType.Cipher_AttachmentDeleted:
msg = this.i18nService.t("deletedAttachmentForItem", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t(
"deletedAttachmentForItem",
this.getShortId(ev.cipherId),
);
break;
case EventType.Cipher_Shared:
msg = this.i18nService.t("movedItemIdToOrg", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t("movedItemIdToOrg", this.getShortId(ev.cipherId));
break;
case EventType.Cipher_ClientViewed:
msg = this.i18nService.t("viewedItemId", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t("viewedItemId", this.getShortId(ev.cipherId));
break;
case EventType.Cipher_ClientToggledPasswordVisible:
msg = this.i18nService.t("viewedPasswordItemId", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t("viewedPasswordItemId", this.getShortId(ev.cipherId));
break;
case EventType.Cipher_ClientToggledHiddenFieldVisible:
msg = this.i18nService.t("viewedHiddenFieldItemId", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t(
"viewedHiddenFieldItemId",
this.getShortId(ev.cipherId),
);
break;
case EventType.Cipher_ClientToggledCardNumberVisible:
msg = this.i18nService.t("viewedCardNumberItemId", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t(
"viewedCardNumberItemId",
this.getShortId(ev.cipherId),
);
break;
case EventType.Cipher_ClientToggledCardCodeVisible:
msg = this.i18nService.t("viewedSecurityCodeItemId", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t(
"viewedSecurityCodeItemId",
this.getShortId(ev.cipherId),
);
break;
case EventType.Cipher_ClientCopiedHiddenField:
msg = this.i18nService.t("copiedHiddenFieldItemId", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t(
"copiedHiddenFieldItemId",
this.getShortId(ev.cipherId),
);
break;
case EventType.Cipher_ClientCopiedPassword:
msg = this.i18nService.t("copiedPasswordItemId", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t("copiedPasswordItemId", this.getShortId(ev.cipherId));
break;
case EventType.Cipher_ClientCopiedCardCode:
msg = this.i18nService.t("copiedSecurityCodeItemId", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t(
"copiedSecurityCodeItemId",
this.getShortId(ev.cipherId),
);
break;
case EventType.Cipher_ClientAutofilled:
msg = this.i18nService.t("autofilledItemId", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t("autofilledItemId", this.getShortId(ev.cipherId));
break;
case EventType.Cipher_UpdatedCollections:
msg = this.i18nService.t("editedCollectionsForItem", this.formatCipherId(ev, options));
humanReadableMsg = this.i18nService.t(
"editedCollectionsForItem",
this.getShortId(ev.cipherId),
);
break;
// Collection
case EventType.Collection_Created:
msg = this.i18nService.t("createdCollectionId", this.formatCollectionId(ev));
humanReadableMsg = this.i18nService.t(
"createdCollectionId",
this.getShortId(ev.collectionId),
);
break;
case EventType.Collection_Updated:
msg = this.i18nService.t("editedCollectionId", this.formatCollectionId(ev));
humanReadableMsg = this.i18nService.t(
"editedCollectionId",
this.getShortId(ev.collectionId),
);
break;
case EventType.Collection_Deleted:
msg = this.i18nService.t("deletedCollectionId", this.formatCollectionId(ev));
humanReadableMsg = this.i18nService.t(
"deletedCollectionId",
this.getShortId(ev.collectionId),
);
break;
// Group
case EventType.Group_Created:
msg = this.i18nService.t("createdGroupId", this.formatGroupId(ev));
humanReadableMsg = this.i18nService.t("createdGroupId", this.getShortId(ev.groupId));
break;
case EventType.Group_Updated:
msg = this.i18nService.t("editedGroupId", this.formatGroupId(ev));
humanReadableMsg = this.i18nService.t("editedGroupId", this.getShortId(ev.groupId));
break;
case EventType.Group_Deleted:
msg = this.i18nService.t("deletedGroupId", this.formatGroupId(ev));
humanReadableMsg = this.i18nService.t("deletedGroupId", this.getShortId(ev.groupId));
break;
// Org user
case EventType.OrganizationUser_Invited:
msg = this.i18nService.t("invitedUserId", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"invitedUserId",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_Confirmed:
msg = this.i18nService.t("confirmedUserId", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"confirmedUserId",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_Updated:
msg = this.i18nService.t("editedUserId", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"editedUserId",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_Removed:
msg = this.i18nService.t("removedUserId", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"removedUserId",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_UpdatedGroups:
msg = this.i18nService.t("editedGroupsForUser", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"editedGroupsForUser",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_UnlinkedSso:
msg = this.i18nService.t("unlinkedSsoUser", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"unlinkedSsoUser",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_ResetPassword_Enroll:
msg = this.i18nService.t("eventEnrollAccountRecovery", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"eventEnrollAccountRecovery",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_ResetPassword_Withdraw:
msg = this.i18nService.t("eventWithdrawAccountRecovery", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"eventWithdrawAccountRecovery",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_AdminResetPassword:
msg = this.i18nService.t("eventAdminPasswordReset", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"eventAdminPasswordReset",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_ResetSsoLink:
msg = this.i18nService.t("eventResetSsoLink", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"eventResetSsoLink",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_FirstSsoLogin:
msg = this.i18nService.t("firstSsoLogin", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"firstSsoLogin",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_Revoked:
msg = this.i18nService.t("revokedUserId", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"revokedUserId",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_Restored:
msg = this.i18nService.t("restoredUserId", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"restoredUserId",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_ApprovedAuthRequest:
msg = this.i18nService.t("approvedAuthRequest", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"approvedAuthRequest",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_RejectedAuthRequest:
msg = this.i18nService.t("rejectedAuthRequest", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"rejectedAuthRequest",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_Deleted:
msg = this.i18nService.t("deletedUserIdEventMessage", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"deletedUserIdEventMessage",
this.getShortId(ev.organizationUserId),
);
break;
case EventType.OrganizationUser_Left:
msg = this.i18nService.t("userLeftOrganization", this.formatOrgUserId(ev));
humanReadableMsg = this.i18nService.t(
"userLeftOrganization",
this.getShortId(ev.organizationUserId),
);
break;
// Org
case EventType.Organization_Updated:
msg = humanReadableMsg = this.i18nService.t("editedOrgSettings");
break;
case EventType.Organization_PurgedVault:
msg = humanReadableMsg = this.i18nService.t("purgedOrganizationVault");
break;
case EventType.Organization_ClientExportedVault:
msg = humanReadableMsg = this.i18nService.t("exportedOrganizationVault");
break;
case EventType.Organization_VaultAccessed:
msg = humanReadableMsg = this.i18nService.t("vaultAccessedByProvider");
break;
case EventType.Organization_EnabledSso:
msg = humanReadableMsg = this.i18nService.t("enabledSso");
break;
case EventType.Organization_DisabledSso:
msg = humanReadableMsg = this.i18nService.t("disabledSso");
break;
case EventType.Organization_EnabledKeyConnector:
msg = humanReadableMsg = this.i18nService.t("enabledKeyConnector");
break;
case EventType.Organization_DisabledKeyConnector:
msg = humanReadableMsg = this.i18nService.t("disabledKeyConnector");
break;
case EventType.Organization_SponsorshipsSynced:
msg = humanReadableMsg = this.i18nService.t("sponsorshipsSynced");
break;
case EventType.Organization_CollectionManagementUpdated:
msg = this.i18nService.t("modifiedCollectionManagement", this.formatOrganizationId(ev));
humanReadableMsg = this.i18nService.t(
"modifiedCollectionManagement",
this.getShortId(ev.organizationId),
);
break;
// Policies
case EventType.Policy_Updated: {
msg = this.i18nService.t("modifiedPolicyId", this.formatPolicyId(ev));
const policy = this.policies.filter((p) => p.id === ev.policyId)[0];
let p1 = this.getShortId(ev.policyId);
if (policy != null) {
p1 = PolicyType[policy.type];
}
humanReadableMsg = this.i18nService.t("modifiedPolicyId", p1);
break;
}
// Provider users:
case EventType.ProviderUser_Invited:
msg = this.i18nService.t("invitedUserId", this.formatProviderUserId(ev));
humanReadableMsg = this.i18nService.t("invitedUserId", this.getShortId(ev.providerUserId));
break;
case EventType.ProviderUser_Confirmed:
msg = this.i18nService.t("confirmedUserId", this.formatProviderUserId(ev));
humanReadableMsg = this.i18nService.t(
"confirmedUserId",
this.getShortId(ev.providerUserId),
);
break;
case EventType.ProviderUser_Updated:
msg = this.i18nService.t("editedUserId", this.formatProviderUserId(ev));
humanReadableMsg = this.i18nService.t("editedUserId", this.getShortId(ev.providerUserId));
break;
case EventType.ProviderUser_Removed:
msg = this.i18nService.t("removedUserId", this.formatProviderUserId(ev));
humanReadableMsg = this.i18nService.t("removedUserId", this.getShortId(ev.providerUserId));
break;
case EventType.ProviderOrganization_Created:
msg = this.i18nService.t("createdOrganizationId", this.formatProviderOrganizationId(ev));
humanReadableMsg = this.i18nService.t(
"createdOrganizationId",
this.getShortId(ev.providerOrganizationId),
);
break;
case EventType.ProviderOrganization_Added:
msg = this.i18nService.t("addedOrganizationId", this.formatProviderOrganizationId(ev));
humanReadableMsg = this.i18nService.t(
"addedOrganizationId",
this.getShortId(ev.providerOrganizationId),
);
break;
case EventType.ProviderOrganization_Removed:
msg = this.i18nService.t("removedOrganizationId", this.formatProviderOrganizationId(ev));
humanReadableMsg = this.i18nService.t(
"removedOrganizationId",
this.getShortId(ev.providerOrganizationId),
);
break;
case EventType.ProviderOrganization_VaultAccessed:
msg = this.i18nService.t("accessedClientVault", this.formatProviderOrganizationId(ev));
humanReadableMsg = this.i18nService.t(
"accessedClientVault",
this.getShortId(ev.providerOrganizationId),
);
break;
// Org Domain claiming events
case EventType.OrganizationDomain_Added:
msg = humanReadableMsg = this.i18nService.t("addedDomain", ev.domainName);
break;
case EventType.OrganizationDomain_Removed:
msg = humanReadableMsg = this.i18nService.t("removedDomain", ev.domainName);
break;
case EventType.OrganizationDomain_Verified:
msg = humanReadableMsg = this.i18nService.t("domainClaimedEvent", ev.domainName);
break;
case EventType.OrganizationDomain_NotVerified:
msg = humanReadableMsg = this.i18nService.t("domainNotClaimedEvent", ev.domainName);
break;
// Secrets Manager
case EventType.Secret_Retrieved:
msg = this.i18nService.t("accessedSecretWithId", this.formatSecretId(ev, options));
humanReadableMsg = this.i18nService.t("accessedSecretWithId", this.getShortId(ev.secretId));
break;
case EventType.Secret_Created:
msg = this.i18nService.t("createdSecretWithId", this.formatSecretId(ev, options));
humanReadableMsg = this.i18nService.t("createdSecretWithId", this.getShortId(ev.secretId));
break;
case EventType.Secret_Deleted:
msg = this.i18nService.t("deletedSecretWithId", this.formatSecretId(ev, options));
humanReadableMsg = this.i18nService.t("deletedSecretWithId", this.getShortId(ev.secretId));
break;
case EventType.Secret_Permanently_Deleted:
msg = this.i18nService.t(
"permanentlyDeletedSecretWithId",
this.formatSecretId(ev, options),
);
humanReadableMsg = this.i18nService.t(
"permanentlyDeletedSecretWithId",
this.getShortId(ev.secretId),
);
break;
case EventType.Secret_Restored:
msg = this.i18nService.t("restoredSecretWithId", this.formatSecretId(ev, options));
humanReadableMsg = this.i18nService.t("restoredSecretWithId", this.getShortId(ev.secretId));
break;
case EventType.Secret_Edited:
msg = this.i18nService.t("editedSecretWithId", this.formatSecretId(ev, options));
humanReadableMsg = this.i18nService.t("editedSecretWithId", this.getShortId(ev.secretId));
break;
case EventType.Project_Retrieved:
msg = this.i18nService.t("accessedProjectWithId", this.formatProjectId(ev, options));
humanReadableMsg = this.i18nService.t(
"accessedProjectWithId",
this.getShortId(ev.projectId),
);
break;
case EventType.Project_Created:
msg = this.i18nService.t("createdProjectWithId", this.formatProjectId(ev, options));
humanReadableMsg = this.i18nService.t(
"createdProjectWithId",
this.getShortId(ev.projectId),
);
break;
case EventType.Project_Deleted:
msg = this.i18nService.t("deletedProjectWithId", this.formatProjectId(ev, options));
humanReadableMsg = this.i18nService.t(
"deletedProjectWithId",
this.getShortId(ev.projectId),
);
break;
case EventType.Project_Edited:
msg = this.i18nService.t("editedProjectWithId", this.formatProjectId(ev, options));
humanReadableMsg = this.i18nService.t("editedProjectWithId", this.getShortId(ev.projectId));
break;
default:
break;
}
return {
message: msg === "" ? null : msg,
humanReadableMessage: humanReadableMsg === "" ? null : humanReadableMsg,
};
}
private getAppInfo(ev: EventResponse): [string, string] {
if (ev.serviceAccountId) {
return ["bwi-globe", this.i18nService.t("sdk")];
}
switch (ev.deviceType) {
case DeviceType.Android:
return ["bwi-mobile", this.i18nService.t("mobile") + " - Android"];
case DeviceType.iOS:
return ["bwi-mobile", this.i18nService.t("mobile") + " - iOS"];
case DeviceType.UWP:
return ["bwi-mobile", this.i18nService.t("mobile") + " - Windows"];
case DeviceType.ChromeExtension:
return ["bwi-puzzle", this.i18nService.t("extension") + " - Chrome"];
case DeviceType.FirefoxExtension:
return ["bwi-puzzle", this.i18nService.t("extension") + " - Firefox"];
case DeviceType.OperaExtension:
return ["bwi-puzzle", this.i18nService.t("extension") + " - Opera"];
case DeviceType.EdgeExtension:
return ["bwi-puzzle", this.i18nService.t("extension") + " - Edge"];
case DeviceType.VivaldiExtension:
return ["bwi-puzzle", this.i18nService.t("extension") + " - Vivaldi"];
case DeviceType.SafariExtension:
return ["bwi-puzzle", this.i18nService.t("extension") + " - Safari"];
case DeviceType.WindowsDesktop:
return ["bwi-desktop", this.i18nService.t("desktop") + " - Windows"];
case DeviceType.MacOsDesktop:
return ["bwi-desktop", this.i18nService.t("desktop") + " - macOS"];
case DeviceType.LinuxDesktop:
return ["bwi-desktop", this.i18nService.t("desktop") + " - Linux"];
case DeviceType.ChromeBrowser:
return ["bwi-browser", this.i18nService.t("webVault") + " - Chrome"];
case DeviceType.FirefoxBrowser:
return ["bwi-browser", this.i18nService.t("webVault") + " - Firefox"];
case DeviceType.OperaBrowser:
return ["bwi-browser", this.i18nService.t("webVault") + " - Opera"];
case DeviceType.SafariBrowser:
return ["bwi-browser", this.i18nService.t("webVault") + " - Safari"];
case DeviceType.VivaldiBrowser:
return ["bwi-browser", this.i18nService.t("webVault") + " - Vivaldi"];
case DeviceType.EdgeBrowser:
return ["bwi-browser", this.i18nService.t("webVault") + " - Edge"];
case DeviceType.IEBrowser:
return ["bwi-browser", this.i18nService.t("webVault") + " - IE"];
case DeviceType.Server:
return ["bwi-user-monitor", this.i18nService.t("server")];
case DeviceType.WindowsCLI:
return ["bwi-cli", this.i18nService.t("cli") + " - Windows"];
case DeviceType.MacOsCLI:
return ["bwi-cli", this.i18nService.t("cli") + " - macOS"];
case DeviceType.LinuxCLI:
return ["bwi-cli", this.i18nService.t("cli") + " - Linux"];
case DeviceType.UnknownBrowser:
return [
"bwi-browser",
this.i18nService.t("webVault") + " - " + this.i18nService.t("unknown"),
];
default:
return ["bwi-globe", this.i18nService.t("unknown")];
}
}
private formatCipherId(ev: EventResponse, options: EventOptions) {
const shortId = this.getShortId(ev.cipherId);
if (ev.organizationId == null || !options.cipherInfo) {
return "<code>" + shortId + "</code>";
}
const a = this.makeAnchor(shortId);
a.setAttribute(
"href",
`#/organizations/${ev.organizationId}/vault?search=${shortId}&viewEvents=${ev.cipherId}&type=all`,
);
return a.outerHTML;
}
private formatGroupId(ev: EventResponse) {
const shortId = this.getShortId(ev.groupId);
const a = this.makeAnchor(shortId);
a.setAttribute("href", "#/organizations/" + ev.organizationId + "/groups?search=" + shortId);
return a.outerHTML;
}
private formatCollectionId(ev: EventResponse) {
const shortId = this.getShortId(ev.collectionId);
const a = this.makeAnchor(shortId);
a.setAttribute(
"href",
`#/organizations/${ev.organizationId}/vault?collectionId=${ev.collectionId}`,
);
return a.outerHTML;
}
private formatOrgUserId(ev: EventResponse) {
const shortId = this.getShortId(ev.organizationUserId);
const a = this.makeAnchor(shortId);
a.setAttribute(
"href",
"#/organizations/" +
ev.organizationId +
"/members?search=" +
shortId +
"&viewEvents=" +
ev.organizationUserId,
);
return a.outerHTML;
}
private formatProviderUserId(ev: EventResponse) {
const shortId = this.getShortId(ev.providerUserId);
const a = this.makeAnchor(shortId);
a.setAttribute(
"href",
"#/providers/" +
ev.providerId +
"/manage/people?search=" +
shortId +
"&viewEvents=" +
ev.providerUserId,
);
return a.outerHTML;
}
private formatProviderOrganizationId(ev: EventResponse) {
const shortId = this.getShortId(ev.providerOrganizationId);
const a = this.makeAnchor(shortId);
a.setAttribute("href", "#/providers/" + ev.providerId + "/clients?search=" + shortId);
return a.outerHTML;
}
private formatOrganizationId(ev: EventResponse) {
const shortId = this.getShortId(ev.organizationId);
const a = this.makeAnchor(shortId);
a.setAttribute("href", "#/organizations/" + ev.organizationId + "/settings/account");
return a.outerHTML;
}
private formatPolicyId(ev: EventResponse) {
const shortId = this.getShortId(ev.policyId);
const a = this.makeAnchor(shortId);
a.setAttribute(
"href",
"#/organizations/" + ev.organizationId + "/settings/policies?policyId=" + ev.policyId,
);
return a.outerHTML;
}
formatSecretId(ev: EventResponse, options: EventOptions): string {
const shortId = this.getShortId(ev.secretId);
if (options.disableLink) {
return shortId;
}
const a = this.makeAnchor(shortId);
a.setAttribute(
"href",
"#/sm/" +
ev.organizationId +
"/secrets?search=" +
shortId +
"&viewEvents=" +
ev.secretId +
"&type=all",
);
return a.outerHTML;
}
formatProjectId(ev: EventResponse, options: EventOptions): string {
const shortId = this.getShortId(ev.projectId);
if (options.disableLink) {
return shortId;
}
const a = this.makeAnchor(shortId);
a.setAttribute(
"href",
"#/sm/" +
ev.organizationId +
"/projects?search=" +
shortId +
"&viewEvents=" +
ev.projectId +
"&type=all",
);
return a.outerHTML;
}
private makeAnchor(shortId: string) {
const a = document.createElement("a");
a.title = this.i18nService.t("view");
a.innerHTML = "<code>" + shortId + "</code>";
return a;
}
private getShortId(id: string) {
return id?.substring(0, 8);
}
private toDateTimeLocalString(date: Date) {
return (
date.getFullYear() +
"-" +
this.pad(date.getMonth() + 1) +
"-" +
this.pad(date.getDate()) +
"T" +
this.pad(date.getHours()) +
":" +
this.pad(date.getMinutes())
);
}
private pad(num: number) {
const norm = Math.floor(Math.abs(num));
return (norm < 10 ? "0" : "") + norm;
}
}
export class EventInfo {
message: string;
humanReadableMessage: string;
appIcon: string;
appName: string;
}
export class EventOptions {
cipherInfo = true;
disableLink = false;
}