Skip to content

Commit 1901d18

Browse files
committed
Show a prompt when attempting to save without full site-access
Closes #494
1 parent 65bceb3 commit 1901d18

File tree

2 files changed

+68
-1
lines changed

2 files changed

+68
-1
lines changed

src/browserExt/background.js

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -705,6 +705,11 @@ Zotero.Connector_Browser = new function() {
705705
};
706706

707707
async function _handleContextMenuClick(info, tab) {
708+
const shouldContinue = await _checkPermissions(tab);
709+
if (!shouldContinue) {
710+
return;
711+
}
712+
708713
const id = info.menuItemId;
709714
// The PDF viewer in Chromium is apparently implemented as a special extension.
710715
// If you right-click on the pdf-reader UI and select a Zotero option, the handler
@@ -969,7 +974,56 @@ Zotero.Connector_Browser = new function() {
969974
return false;
970975
}
971976

972-
function _browserAction(tab) {
977+
/**
978+
* Check if we have permission to run on all sites.
979+
* Prompts the user if permissions are insufficient.
980+
* @param {Object} tab - The current tab object
981+
* @returns {Promise<boolean>} - Returns false if the action should not proceed
982+
*/
983+
async function _checkPermissions(tab) {
984+
// Firefox doesn't have per-site permissions in MV2.
985+
if (!Zotero.isChromium) {
986+
return true;
987+
}
988+
989+
try {
990+
const hasPermissions = await browser.permissions.contains({
991+
origins: ["https://*/*"]
992+
});
993+
994+
if (hasPermissions) {
995+
return true;
996+
}
997+
998+
const extensionId = browser.runtime.id;
999+
const result = await Zotero.Messaging.sendMessage('confirm', {
1000+
title: Zotero.getString("permissions_siteAccess_title"),
1001+
button1Text: Zotero.getString("permissions_siteAccess_openPreferences"),
1002+
button2Text: Zotero.getString("general_cancel"),
1003+
button3Text: Zotero.getString("general_continueAnyway"),
1004+
message: Zotero.getString("permissions_siteAccess_message")
1005+
}, tab);
1006+
1007+
if (result) {
1008+
if (result.button === 1) {
1009+
browser.tabs.create({
1010+
url: `about:extensions/?id=${extensionId}`
1011+
});
1012+
}
1013+
return result.button === 3;
1014+
}
1015+
} catch (e) {
1016+
Zotero.debug('Error checking permissions: ' + e.message);
1017+
return true;
1018+
}
1019+
}
1020+
1021+
async function _browserAction(tab) {
1022+
const shouldContinue = await _checkPermissions(tab);
1023+
if (!shouldContinue) {
1024+
return;
1025+
}
1026+
9731027
let tabInfo = Zotero.Connector_Browser.getTabInfo(tab.id);
9741028
if (_isBetaBuildBeyondExpiration) {
9751029
Zotero.Messaging.sendMessage('expiredBetaBuild')

src/messages.json

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
"general_continue": {
3030
"message": "Continue"
3131
},
32+
"general_continueAnyway": {
33+
"message": "Continue Anyway"
34+
},
3235
"general_dontWarnAgain": {
3336
"message": "Don't Warn Again"
3437
},
@@ -272,5 +275,15 @@
272275
},
273276
"reloadVia": {
274277
"message": "Reload via $1"
278+
},
279+
280+
"permissions_siteAccess_title": {
281+
"message": "Site Access Permissions Required"
282+
},
283+
"permissions_siteAccess_openPreferences": {
284+
"message": "Open Extension Preferences"
285+
},
286+
"permissions_siteAccess_message": {
287+
"message": "<p>Zotero Connector requires permission to run on all websites to function properly.</p><p>To enable this, change the \"Site Access\" setting to \"On all sites\" in the Extension Preferences page.</p>"
275288
}
276289
}

0 commit comments

Comments
 (0)