1
0
mirror of https://github.com/bitwarden/browser.git synced 2024-09-27 04:03:00 +02:00

[PM-5148] Removing Browser Autofill Override Setting and Add Message (#7110)

* [PM-5148] Removing Browser Autofill Override Setting and Add Message

* [PM-5148] Removing translation keys

* [PM-5148] Removing translation keys

* [PM-5148] Modifying how we present the link to users to ensure translations can be more effective
This commit is contained in:
Cesar Gonzalez 2023-12-07 14:39:28 -06:00 committed by GitHub
parent 2b3faca86b
commit e5b8fd4388
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 37 additions and 137 deletions

View File

@ -1033,6 +1033,12 @@
"showAutoFillMenuOnFormFieldsDescAlt": { "showAutoFillMenuOnFormFieldsDescAlt": {
"message": "Applies to all logged in accounts." "message": "Applies to all logged in accounts."
}, },
"turnOffBrowserBuiltInPasswordManagerSettings": {
"message": "Turn off your browsers built in password manager settings to avoid conflicts."
},
"turnOffBrowserBuiltInPasswordManagerSettingsLink": {
"message": "Edit browser settings."
},
"autofillOverlayVisibilityOff": { "autofillOverlayVisibilityOff": {
"message": "Off", "message": "Off",
"description": "Overlay setting select option for disabling autofill overlay" "description": "Overlay setting select option for disabling autofill overlay"
@ -2547,36 +2553,12 @@
"message": "Bitwarden auto-fill menu available. Press the down arrow key to select.", "message": "Bitwarden auto-fill menu available. Press the down arrow key to select.",
"description": "Screen reader text for announcing when the overlay opens on the page" "description": "Screen reader text for announcing when the overlay opens on the page"
}, },
"overrideBrowserAutofillTitle": {
"message": "Override browser auto-fill?",
"description": "Dialog title facilitating the ability to override a chrome browser's default autofill behavior"
},
"overrideBrowserAutofillDescription": {
"message": "Leaving this setting off may cause conflicts between the Bitwarden auto-fill menu and your browsers.",
"description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior"
},
"overrideBrowserAutofillPrivacyRequiredDescription": {
"message": "Leaving this setting off may cause conflicts between the Bitwarden auto-fill menu and your browsers. Turning this on will restart the Bitwarden extension.",
"description": "Dialog message facilitating the ability to override a chrome browser's default autofill behavior"
},
"turnOn": { "turnOn": {
"message": "Turn on" "message": "Turn on"
}, },
"ignore": { "ignore": {
"message": "Ignore" "message": "Ignore"
}, },
"overrideBrowserAutoFillSettings": {
"message": "Override browser auto-fill settings",
"description": "Label for the setting that allows overriding the default browser autofill settings"
},
"extensionPrivacyPermissionNotGrantedTitle": {
"message": "Unable to override browser auto-fill",
"description": "Title for the dialog that appears when the user has not granted the extension permission to set privacy settings"
},
"extensionPrivacyPermissionNotGrantedDescription": {
"message": "Bitwarden must have access to the extension's privacy permission to override browser auto-fill settings.",
"description": "Description for the dialog that appears when the user has not granted the extension permission to set privacy settings"
},
"importData": { "importData": {
"message": "Import data", "message": "Import data",
"description": "Used for the header of the import dialog, the import button and within the file-password-prompt" "description": "Used for the header of the import dialog, the import button and within the file-password-prompt"

View File

@ -45,22 +45,20 @@
<div class="box-footer" *ngIf="accountSwitcherEnabled"> <div class="box-footer" *ngIf="accountSwitcherEnabled">
{{ "showAutoFillMenuOnFormFieldsDescAlt" | i18n }} {{ "showAutoFillMenuOnFormFieldsDescAlt" | i18n }}
</div> </div>
<div class="box-footer">
{{ "turnOffBrowserBuiltInPasswordManagerSettings" | i18n }}
<a
[attr.href]="disablePasswordManagerLink"
(click)="openDisablePasswordManagerLink($event)"
target="_blank"
rel="noopener noreferrer"
>
{{ "turnOffBrowserBuiltInPasswordManagerSettingsLink" | i18n }}
</a>
</div>
</div> </div>
</div> </div>
</ng-container> </ng-container>
<div class="box tw-mt-4" *ngIf="canOverrideBrowserAutofillSetting">
<div class="box-content">
<div class="box-content-row box-content-row-checkbox" appBoxRow>
<label for="overrideBrowserAutofill">{{ "overrideBrowserAutoFillSettings" | i18n }}</label>
<input
id="overrideBrowserAutofill"
type="checkbox"
(change)="updateDefaultBrowserAutofillDisabled()"
[(ngModel)]="defaultBrowserAutofillDisabled"
/>
</div>
</div>
</div>
<div class="box tw-mt-4"> <div class="box tw-mt-4">
<div class="box-content"> <div class="box-content">
<div class="box-content-row box-content-row-checkbox" appBoxRow> <div class="box-content-row box-content-row-checkbox" appBoxRow>

View File

@ -7,7 +7,6 @@ import { I18nService } from "@bitwarden/common/platform/abstractions/i18n.servic
import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service"; import { PlatformUtilsService } from "@bitwarden/common/platform/abstractions/platform-utils.service";
import { StateService } from "@bitwarden/common/platform/abstractions/state.service"; import { StateService } from "@bitwarden/common/platform/abstractions/state.service";
import { UriMatchType } from "@bitwarden/common/vault/enums"; import { UriMatchType } from "@bitwarden/common/vault/enums";
import { DialogService } from "@bitwarden/components";
import { BrowserApi } from "../../../platform/browser/browser-api"; import { BrowserApi } from "../../../platform/browser/browser-api";
import { flagEnabled } from "../../../platform/flags"; import { flagEnabled } from "../../../platform/flags";
@ -18,11 +17,10 @@ import { AutofillOverlayVisibility } from "../../utils/autofill-overlay.enum";
templateUrl: "autofill.component.html", templateUrl: "autofill.component.html",
}) })
export class AutofillComponent implements OnInit { export class AutofillComponent implements OnInit {
protected canOverrideBrowserAutofillSetting = false;
protected defaultBrowserAutofillDisabled = false;
protected isAutoFillOverlayFlagEnabled = false; protected isAutoFillOverlayFlagEnabled = false;
protected autoFillOverlayVisibility: number; protected autoFillOverlayVisibility: number;
protected autoFillOverlayVisibilityOptions: any[]; protected autoFillOverlayVisibilityOptions: any[];
protected disablePasswordManagerLink: string;
enableAutoFillOnPageLoad = false; enableAutoFillOnPageLoad = false;
autoFillOnPageLoadDefault = false; autoFillOnPageLoadDefault = false;
autoFillOnPageLoadOptions: any[]; autoFillOnPageLoadOptions: any[];
@ -37,7 +35,6 @@ export class AutofillComponent implements OnInit {
private platformUtilsService: PlatformUtilsService, private platformUtilsService: PlatformUtilsService,
private configService: ConfigServiceAbstraction, private configService: ConfigServiceAbstraction,
private settingsService: SettingsService, private settingsService: SettingsService,
private dialogService: DialogService,
) { ) {
this.autoFillOverlayVisibilityOptions = [ this.autoFillOverlayVisibilityOptions = [
{ {
@ -67,13 +64,10 @@ export class AutofillComponent implements OnInit {
]; ];
this.accountSwitcherEnabled = flagEnabled("accountSwitching"); this.accountSwitcherEnabled = flagEnabled("accountSwitching");
this.disablePasswordManagerLink = this.getDisablePasswordManagerLink();
} }
async ngOnInit() { async ngOnInit() {
this.canOverrideBrowserAutofillSetting = this.platformUtilsService.isChrome();
this.defaultBrowserAutofillDisabled = await this.browserAutofillSettingCurrentlyOverridden();
this.isAutoFillOverlayFlagEnabled = await this.configService.getFeatureFlag<boolean>( this.isAutoFillOverlayFlagEnabled = await this.configService.getFeatureFlag<boolean>(
FeatureFlag.AutofillOverlay, FeatureFlag.AutofillOverlay,
); );
@ -91,54 +85,8 @@ export class AutofillComponent implements OnInit {
await this.setAutofillKeyboardHelperText(command); await this.setAutofillKeyboardHelperText(command);
} }
async updateDefaultBrowserAutofillDisabled() {
const privacyPermissionGranted = await this.privacyPermissionGranted();
if (!this.defaultBrowserAutofillDisabled && !privacyPermissionGranted) {
return;
}
if (
!privacyPermissionGranted &&
!(await BrowserApi.requestPermission({ permissions: ["privacy"] }))
) {
await this.dialogService.openSimpleDialog({
title: { key: "extensionPrivacyPermissionNotGrantedTitle" },
content: { key: "extensionPrivacyPermissionNotGrantedDescription" },
acceptButtonText: { key: "ok" },
cancelButtonText: null,
type: "warning",
});
this.defaultBrowserAutofillDisabled = false;
return;
}
await BrowserApi.updateDefaultBrowserAutofillSettings(!this.defaultBrowserAutofillDisabled);
}
async updateAutoFillOverlayVisibility() { async updateAutoFillOverlayVisibility() {
await this.settingsService.setAutoFillOverlayVisibility(this.autoFillOverlayVisibility); await this.settingsService.setAutoFillOverlayVisibility(this.autoFillOverlayVisibility);
if (
this.autoFillOverlayVisibility === AutofillOverlayVisibility.Off ||
!this.canOverrideBrowserAutofillSetting ||
(await this.browserAutofillSettingCurrentlyOverridden())
) {
return;
}
const permissionGranted = await this.privacyPermissionGranted();
const contentKey = permissionGranted
? "overrideBrowserAutofillDescription"
: "overrideBrowserAutofillPrivacyRequiredDescription";
await this.dialogService.openSimpleDialog({
title: { key: "overrideBrowserAutofillTitle" },
content: { key: contentKey },
acceptButtonText: { key: "turnOn" },
acceptAction: async () => await this.handleOverrideDialogAccept(),
cancelButtonText: { key: "ignore" },
type: "info",
});
} }
async updateAutoFillOnPageLoad() { async updateAutoFillOnPageLoad() {
@ -175,24 +123,25 @@ export class AutofillComponent implements OnInit {
} }
} }
private handleOverrideDialogAccept = async () => { private getDisablePasswordManagerLink(): string {
this.defaultBrowserAutofillDisabled = true; if (this.platformUtilsService.isChrome()) {
await this.updateDefaultBrowserAutofillDisabled(); return "chrome://settings/autofill";
}; }
if (this.platformUtilsService.isOpera()) {
async browserAutofillSettingCurrentlyOverridden() { return "opera://settings/autofill";
if (!this.canOverrideBrowserAutofillSetting) { }
return false; if (this.platformUtilsService.isEdge()) {
return "edge://settings/passwords";
}
if (this.platformUtilsService.isVivaldi()) {
return "vivaldi://settings/autofill";
} }
if (!(await this.privacyPermissionGranted())) { return "https://bitwarden.com/help/disable-browser-autofill/";
return false;
}
return await BrowserApi.browserAutofillSettingsOverridden();
} }
async privacyPermissionGranted(): Promise<boolean> { protected openDisablePasswordManagerLink(event: Event) {
return await BrowserApi.permissionsGranted(["privacy"]); event.preventDefault();
BrowserApi.createNewTab(this.disablePasswordManagerLink);
} }
} }

View File

@ -59,7 +59,7 @@
"webRequest", "webRequest",
"webRequestBlocking" "webRequestBlocking"
], ],
"optional_permissions": ["nativeMessaging", "privacy"], "optional_permissions": ["nativeMessaging"],
"content_security_policy": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'", "content_security_policy": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'",
"sandbox": { "sandbox": {
"pages": ["overlay/button.html", "overlay/list.html"], "pages": ["overlay/button.html", "overlay/list.html"],

View File

@ -69,7 +69,7 @@
"alarms", "alarms",
"scripting" "scripting"
], ],
"optional_permissions": ["nativeMessaging", "privacy"], "optional_permissions": ["nativeMessaging"],
"host_permissions": ["http://*/*", "https://*/*"], "host_permissions": ["http://*/*", "https://*/*"],
"content_security_policy": { "content_security_policy": {
"extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'", "extension_pages": "script-src 'self' 'wasm-unsafe-eval'; object-src 'self'",

View File

@ -439,33 +439,4 @@ export class BrowserApi {
}); });
}); });
} }
/**
* Identifies if the browser autofill settings are overridden by the extension.
*/
static async browserAutofillSettingsOverridden(): Promise<boolean> {
const autofillAddressOverridden: boolean = await new Promise((resolve) =>
chrome.privacy.services.autofillAddressEnabled.get({}, (details) =>
resolve(details.levelOfControl === "controlled_by_this_extension" && !details.value),
),
);
const autofillCreditCardOverridden: boolean = await new Promise((resolve) =>
chrome.privacy.services.autofillCreditCardEnabled.get({}, (details) =>
resolve(details.levelOfControl === "controlled_by_this_extension" && !details.value),
),
);
return autofillAddressOverridden && autofillCreditCardOverridden;
}
/**
* Updates the browser autofill settings to the given value.
*
* @param value - Determines whether to enable or disable the autofill settings.
*/
static async updateDefaultBrowserAutofillSettings(value: boolean) {
chrome.privacy.services.autofillAddressEnabled.set({ value });
chrome.privacy.services.autofillCreditCardEnabled.set({ value });
}
} }