Add vault status check before generating new credential (#541)

This commit is contained in:
Leendert de Borst
2025-02-11 17:16:42 +01:00
parent bd833414ad
commit 0862aa64cb
3 changed files with 45 additions and 1 deletions

View File

@@ -1,6 +1,6 @@
import { VaultState, initialVaultState } from './src/background/VaultState';
import { setupContextMenus, handleContextMenuClick } from './src/background/ContextMenu';
import { handleClearVault, handleCreateIdentity, handleGetCredentials, handleGetDefaultEmailDomain, handleGetDerivedKey, handleGetVault, handleStoreVault } from './src/background/VaultMessageHandler';
import { handleClearVault, handleCreateIdentity, handleGetCredentials, handleGetDefaultEmailDomain, handleGetDerivedKey, handleGetVault, handleStoreVault, handleSyncVault } from './src/background/VaultMessageHandler';
import { handleOpenPopup, handlePopupWithCredential } from './src/background/PopupMessageHandler';
let vaultState: VaultState = { ...initialVaultState };
@@ -17,6 +17,10 @@ chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
handleStoreVault(message, vaultState, sendResponse);
break;
case 'SYNC_VAULT':
handleSyncVault(vaultState, sendResponse);
break;
case 'GET_VAULT':
handleGetVault(vaultState, sendResponse);
break;

View File

@@ -6,6 +6,7 @@ import { WebApiService } from '../shared/WebApiService';
import { Vault } from '../shared/types/webapi/Vault';
import { Credential } from '../shared/types/Credential';
import { VaultResponse } from '../shared/types/webapi/VaultResponse';
import { StatusResponse } from '../shared/types/webapi/StatusResponse';
/**
* Store the vault in browser storage.
@@ -37,6 +38,42 @@ export async function handleStoreVault(
}
}
/**
* Sync the vault with the server to check if a newer vault is available. If so, the vault will be updated.
*/
export async function handleSyncVault(
vaultState: VaultState,
sendResponse: (response: any) => void
) : Promise<void> {
const webApi = new WebApiService(() => {});
await webApi.initializeBaseUrl();
const response = await webApi.get('Auth/status') as StatusResponse;
if (!response.supported) {
sendResponse({ success: false, error: 'Browser extension is not supported. Please update to the latest version.' });
return;
}
const result = await chrome.storage.session.get([
'vaultRevisionNumber'
]);
if (response.vaultRevision > result.vaultRevisionNumber) {
// Retrieve the latest vault from the server.
const vaultResponse = await webApi.get('Vault') as VaultResponse;
// Store encrypted vault in chrome.storage.session
await chrome.storage.session.set({
encryptedVault: vaultResponse.vault.blob,
publicEmailDomains: vaultResponse.vault.publicEmailDomainList,
privateEmailDomains: vaultResponse.vault.privateEmailDomainList,
vaultRevisionNumber: vaultResponse.vault.currentRevisionNumber
});
}
sendResponse({ success: true });
}
/**
* Get the vault from browser storage.
*/

View File

@@ -189,6 +189,9 @@ export function createAutofillPopup(input: HTMLInputElement, credentials: Creden
const loadingPopup = createLoadingPopup(input, 'Creating new identity...');
try {
// Sync with api to ensure we have the latest vault.
await chrome.runtime.sendMessage({ type: 'SYNC_VAULT' });
// Retrieve default email domain from background
const response = await new Promise<{ domain: string }>((resolve) => {
chrome.runtime.sendMessage({ type: 'GET_DEFAULT_EMAIL_DOMAIN' }, resolve);