From f6a54610a60abcb1d1be0469e307123105147eee Mon Sep 17 00:00:00 2001
From: Abe Jellinek <1770299+AbeJellinek@users.noreply.github.com>
Date: Tue, 12 May 2026 13:48:04 -0400
Subject: [PATCH] Local API: Support write requests
---
.../preferences/preferences_advanced.js | 18 +
.../preferences/preferences_advanced.xhtml | 7 +
chrome/content/zotero/xpcom/server/server.js | 20 +-
.../zotero/xpcom/server/server_localAPI.js | 1561 ++++++++++++++++-
chrome/locale/en-US/zotero/preferences.ftl | 2 +
chrome/locale/en-US/zotero/zotero.ftl | 6 +
test/tests/server_localAPITest.js | 1524 ++++++++++++++++
7 files changed, 3082 insertions(+), 56 deletions(-)
diff --git a/chrome/content/zotero/preferences/preferences_advanced.js b/chrome/content/zotero/preferences/preferences_advanced.js
index 7c831f471c..c6ad5e008e 100644
--- a/chrome/content/zotero/preferences/preferences_advanced.js
+++ b/chrome/content/zotero/preferences/preferences_advanced.js
@@ -485,24 +485,42 @@ Zotero_Preferences.Advanced = {
let checkbox = document.getElementById('zotero-prefpane-advanced-enable-local-api');
let availableMessage = document.getElementById('zotero-prefpane-advanced-local-api-available');
+ let authorizationsSection = document.getElementById('zotero-prefpane-advanced-local-api-write-authorizations');
let serverDisabledSection = document.getElementById('zotero-prefpane-advanced-server-disabled');
if (!serverEnabled) {
checkbox.disabled = true;
availableMessage.hidden = true;
+ authorizationsSection.hidden = true;
serverDisabledSection.hidden = false;
return;
}
checkbox.disabled = false;
availableMessage.hidden = !localAPIEnabled;
+ authorizationsSection.hidden = !localAPIEnabled;
serverDisabledSection.hidden = true;
document.l10n.setArgs(availableMessage, {
url: `http://localhost:${Zotero.Server.port}/api/`
});
+
+ if (localAPIEnabled) {
+ this.updateLocalAPIClearAuthorizationsButton();
+ }
},
+ async updateLocalAPIClearAuthorizationsButton() {
+ let clearButton = document.getElementById('zotero-prefpane-advanced-local-api-clear');
+ let count = await Zotero.Server.LocalAPI.getAuthorizationCount();
+ clearButton.disabled = count === 0;
+ },
+
+ async clearLocalAPIAuthorizations() {
+ await Zotero.Server.LocalAPI.clearAuthorizations();
+ await this.updateLocalAPIClearAuthorizationsButton();
+ },
+
enableServerForLocalAPI() {
Zotero.Prefs.set('httpServer.enabled', true);
Zotero.Utilities.Internal.quit(true);
diff --git a/chrome/content/zotero/preferences/preferences_advanced.xhtml b/chrome/content/zotero/preferences/preferences_advanced.xhtml
index cc0901cfcc..a701330838 100644
--- a/chrome/content/zotero/preferences/preferences_advanced.xhtml
+++ b/chrome/content/zotero/preferences/preferences_advanced.xhtml
@@ -49,6 +49,13 @@
>
+
+
+