make clipboardRead optional permission

This commit is contained in:
Kyle Spearrin 2019-03-06 18:42:05 -05:00
parent e09289bf58
commit a797f18b78
3 changed files with 51 additions and 5 deletions

View File

@ -295,4 +295,32 @@ export class BrowserApi {
return chrome.runtime.reload(); return chrome.runtime.reload();
} }
} }
static hasPermission(permissionName: string): Promise<boolean> {
return new Promise((resolve) => {
if (BrowserApi.isSafariApi) {
resolve(true);
} else {
chrome.permissions.contains({
permissions: [permissionName],
}, (granted: boolean) => {
resolve(granted);
});
}
});
}
static requestPermission(permissionName: string): Promise<boolean> {
return new Promise((resolve) => {
if (BrowserApi.isSafariApi) {
resolve(true);
} else {
chrome.permissions.request({
permissions: [permissionName],
}, (granted: boolean) => {
resolve(granted);
});
}
});
}
} }

View File

@ -71,7 +71,6 @@
"contextMenus", "contextMenus",
"storage", "storage",
"unlimitedStorage", "unlimitedStorage",
"clipboardRead",
"clipboardWrite", "clipboardWrite",
"idle", "idle",
"http://*/*", "http://*/*",
@ -79,6 +78,9 @@
"webRequest", "webRequest",
"webRequestBlocking" "webRequestBlocking"
], ],
"optional_permissions": [
"clipboardRead"
],
"content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'", "content_security_policy": "script-src 'self' 'unsafe-eval'; object-src 'self'",
"commands": { "commands": {
"autofill_login": { "autofill_login": {

View File

@ -16,6 +16,8 @@ import { TotpService } from 'jslib/abstractions/totp.service';
import { ConstantsService } from 'jslib/services/constants.service'; import { ConstantsService } from 'jslib/services/constants.service';
import { BrowserApi } from '../../browser/browserApi';
@Component({ @Component({
selector: 'app-options', selector: 'app-options',
templateUrl: 'options.component.html', templateUrl: 'options.component.html',
@ -35,6 +37,7 @@ export class OptionsComponent implements OnInit {
themeOptions: any[]; themeOptions: any[];
defaultUriMatch = UriMatchType.Domain; defaultUriMatch = UriMatchType.Domain;
uriMatchOptions: any[]; uriMatchOptions: any[];
clearClipboardOriginalValue: number;
clearClipboard: number; clearClipboard: number;
clearClipboardOptions: any[]; clearClipboardOptions: any[];
@ -94,6 +97,7 @@ export class OptionsComponent implements OnInit {
this.defaultUriMatch = defaultUriMatch == null ? UriMatchType.Domain : defaultUriMatch; this.defaultUriMatch = defaultUriMatch == null ? UriMatchType.Domain : defaultUriMatch;
this.clearClipboard = await this.storageService.get<number>(ConstantsService.clearClipboardKey); this.clearClipboard = await this.storageService.get<number>(ConstantsService.clearClipboardKey);
this.clearClipboardOriginalValue = this.clearClipboard;
} }
async updateAddLoginNotification() { async updateAddLoginNotification() {
@ -155,10 +159,22 @@ export class OptionsComponent implements OnInit {
} }
async saveClearClipboard() { async saveClearClipboard() {
if (!this.showClearClipboard) {
return;
}
let hasClipboardPermission = await BrowserApi.hasPermission('clipboardRead');
if (!hasClipboardPermission) {
hasClipboardPermission = await BrowserApi.requestPermission('clipboardRead');
}
if (hasClipboardPermission) {
this.clearClipboardOriginalValue = this.clearClipboard;
await this.storageService.save(ConstantsService.clearClipboardKey, this.clearClipboard); await this.storageService.save(ConstantsService.clearClipboardKey, this.clearClipboard);
this.analytics.eventTrack.next({ this.analytics.eventTrack.next({
action: 'Set Clear Clipboard ' + (this.clearClipboard == null ? 'Disabled' : this.clearClipboard), action: 'Set Clear Clipboard ' + (this.clearClipboard == null ? 'Disabled' : this.clearClipboard),
}); });
} else {
this.clearClipboard = this.clearClipboardOriginalValue;
}
} }
private callAnalytics(name: string, enabled: boolean) { private callAnalytics(name: string, enabled: boolean) {