mirror of
https://github.com/bitwarden/browser
synced 2025-12-06 00:13:28 +00:00
[PM-27754] - [Defect] MP prompt is missing before "Cannot autofill" modal when trying to autofill a login with "Exact" default matching set (#17247)
* add persistent callout in settings for non-premium users
* always call password reprompt in doAutofill
* ensure password reprompt is checked in all instances
* Revert "add persistent callout in settings for non-premium users"
This reverts commit d206832cd3.
This commit is contained in:
@@ -144,6 +144,15 @@ describe("ItemMoreOptionsComponent", () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
describe("doAutofill", () => {
|
describe("doAutofill", () => {
|
||||||
|
it("calls the passwordService to passwordRepromptCheck", async () => {
|
||||||
|
autofillSvc.currentAutofillTab$.next({ url: "https://page.example.com" });
|
||||||
|
mockConfirmDialogResult(AutofillConfirmationDialogResult.AutofilledOnly);
|
||||||
|
|
||||||
|
await component.doAutofill();
|
||||||
|
|
||||||
|
expect(passwordRepromptService.passwordRepromptCheck).toHaveBeenCalledWith(baseCipher);
|
||||||
|
});
|
||||||
|
|
||||||
it("calls the autofill service to autofill without showing the confirmation dialog when the feature flag is disabled or search text is not present", async () => {
|
it("calls the autofill service to autofill without showing the confirmation dialog when the feature flag is disabled or search text is not present", async () => {
|
||||||
autofillSvc.currentAutofillTab$.next({ url: "https://page.example.com" });
|
autofillSvc.currentAutofillTab$.next({ url: "https://page.example.com" });
|
||||||
|
|
||||||
@@ -160,15 +169,6 @@ describe("ItemMoreOptionsComponent", () => {
|
|||||||
expect(dialogService.openSimpleDialog).not.toHaveBeenCalled();
|
expect(dialogService.openSimpleDialog).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
|
|
||||||
it("calls the passwordService to passwordRepromptCheck", async () => {
|
|
||||||
autofillSvc.currentAutofillTab$.next({ url: "https://page.example.com" });
|
|
||||||
mockConfirmDialogResult(AutofillConfirmationDialogResult.AutofilledOnly);
|
|
||||||
|
|
||||||
await component.doAutofill();
|
|
||||||
|
|
||||||
expect(passwordRepromptService.passwordRepromptCheck).toHaveBeenCalledWith(baseCipher);
|
|
||||||
});
|
|
||||||
|
|
||||||
it("does nothing if the user fails master password reprompt", async () => {
|
it("does nothing if the user fails master password reprompt", async () => {
|
||||||
baseCipher.reprompt = 2; // Master Password reprompt enabled
|
baseCipher.reprompt = 2; // Master Password reprompt enabled
|
||||||
autofillSvc.currentAutofillTab$.next({ url: "https://page.example.com" });
|
autofillSvc.currentAutofillTab$.next({ url: "https://page.example.com" });
|
||||||
@@ -199,6 +199,15 @@ describe("ItemMoreOptionsComponent", () => {
|
|||||||
passwordRepromptService.passwordRepromptCheck.mockResolvedValue(true);
|
passwordRepromptService.passwordRepromptCheck.mockResolvedValue(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("calls the passwordService to passwordRepromptCheck", async () => {
|
||||||
|
autofillSvc.currentAutofillTab$.next({ url: "https://page.example.com" });
|
||||||
|
mockConfirmDialogResult(AutofillConfirmationDialogResult.AutofilledOnly);
|
||||||
|
|
||||||
|
await component.doAutofill();
|
||||||
|
|
||||||
|
expect(passwordRepromptService.passwordRepromptCheck).toHaveBeenCalledWith(baseCipher);
|
||||||
|
});
|
||||||
|
|
||||||
it("opens the autofill confirmation dialog with filtered saved URLs when the feature flag is enabled and search text is present", async () => {
|
it("opens the autofill confirmation dialog with filtered saved URLs when the feature flag is enabled and search text is present", async () => {
|
||||||
autofillSvc.currentAutofillTab$.next({ url: "https://page.example.com/path" });
|
autofillSvc.currentAutofillTab$.next({ url: "https://page.example.com/path" });
|
||||||
const openSpy = mockConfirmDialogResult(AutofillConfirmationDialogResult.Canceled);
|
const openSpy = mockConfirmDialogResult(AutofillConfirmationDialogResult.Canceled);
|
||||||
@@ -259,7 +268,16 @@ describe("ItemMoreOptionsComponent", () => {
|
|||||||
uriMatchStrategy$.next(UriMatchStrategy.Exact);
|
uriMatchStrategy$.next(UriMatchStrategy.Exact);
|
||||||
});
|
});
|
||||||
|
|
||||||
it("shows the exact match dialog and not the password dialog", async () => {
|
it("calls the passwordService to passwordRepromptCheck", async () => {
|
||||||
|
autofillSvc.currentAutofillTab$.next({ url: "https://page.example.com" });
|
||||||
|
mockConfirmDialogResult(AutofillConfirmationDialogResult.AutofilledOnly);
|
||||||
|
|
||||||
|
await component.doAutofill();
|
||||||
|
|
||||||
|
expect(passwordRepromptService.passwordRepromptCheck).toHaveBeenCalledWith(baseCipher);
|
||||||
|
});
|
||||||
|
|
||||||
|
it("shows the exact match dialog", async () => {
|
||||||
autofillSvc.currentAutofillTab$.next({ url: "https://no-match.example.com" });
|
autofillSvc.currentAutofillTab$.next({ url: "https://no-match.example.com" });
|
||||||
|
|
||||||
await component.doAutofill();
|
await component.doAutofill();
|
||||||
@@ -273,7 +291,6 @@ describe("ItemMoreOptionsComponent", () => {
|
|||||||
}),
|
}),
|
||||||
);
|
);
|
||||||
expect(autofillSvc.doAutofill).not.toHaveBeenCalled();
|
expect(autofillSvc.doAutofill).not.toHaveBeenCalled();
|
||||||
expect(passwordRepromptService.passwordRepromptCheck).not.toHaveBeenCalled();
|
|
||||||
expect(autofillSvc.doAutofillAndSave).not.toHaveBeenCalled();
|
expect(autofillSvc.doAutofillAndSave).not.toHaveBeenCalled();
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -202,6 +202,10 @@ export class ItemMoreOptionsComponent {
|
|||||||
async doAutofill() {
|
async doAutofill() {
|
||||||
const cipher = await this.cipherService.getFullCipherView(this.cipher);
|
const cipher = await this.cipherService.getFullCipherView(this.cipher);
|
||||||
|
|
||||||
|
if (!(await this.passwordRepromptService.passwordRepromptCheck(this.cipher))) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const uris = cipher.login?.uris ?? [];
|
const uris = cipher.login?.uris ?? [];
|
||||||
const cipherHasAllExactMatchLoginUris =
|
const cipherHasAllExactMatchLoginUris =
|
||||||
uris.length > 0 && uris.every((u) => u.uri && u.match === UriMatchStrategy.Exact);
|
uris.length > 0 && uris.every((u) => u.uri && u.match === UriMatchStrategy.Exact);
|
||||||
@@ -223,10 +227,6 @@ export class ItemMoreOptionsComponent {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(await this.passwordRepromptService.passwordRepromptCheck(this.cipher))) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!showAutofillConfirmation) {
|
if (!showAutofillConfirmation) {
|
||||||
await this.vaultPopupAutofillService.doAutofill(cipher, true, true);
|
await this.vaultPopupAutofillService.doAutofill(cipher, true, true);
|
||||||
return;
|
return;
|
||||||
|
|||||||
Reference in New Issue
Block a user