Commit graph

11014 commits

Author SHA1 Message Date
Dan Stillman
74a3617e7e Fix full-text indexing failing silently after periodic vacuum or backup
Some checks failed
CI / Build, Upload, Test (push) Has been cancelled
vacuum() and the APFS-cloning offline backup path both close and
reopen the SQLite connection, which drops all ATTACHed databases --
including the in-memory "indexing" alias used for the fulltextWords
scratch table set up in Fulltext.init(). Once the connection is
reopened, indexing queries fail with "no such table:
indexing.fulltextWords", and indexItems()'s ignoreErrors path
routes the error to logError(), so indexing silently stops working
for the rest of the session.

Add an onConnect() hook on Zotero.DBConnection for per-connection
state that doesn't persist across reopens, and use it from
Fulltext.init() to re-attach the indexing DB on each reconnect.

Regression sources:

- 67288047f3 ("Use APFS cloning for file copies on macOS") flips
  online idle backups to offline-with-clone on APFS, so every idle
  backup interval (24h default) closes and reopens the connection.
  Affects Mac users on APFS.
- b27c4cb023 ("Enable SQLite WAL mode and add periodic VACUUM
  INTO") adds the vacuum path, which closes and reopens on the
  first idle period in a session that passes the freelist/time
  gates. Affects all users with sufficient DB churn, roughly once
  per 14 days.

https://forums.zotero.org/discussion/131576/debug-id-d848621212-indexing-of-pdfs-fail-zotero-9-0-3
https://forums.zotero.org/discussion/131718/possible-bug-regression-report-search-unusable-on-macos-zotero-9-0-3-with-large-library
(cherry picked from commit 70c4cadab1)
2026-05-22 11:00:03 -04:00
Dan Stillman
841efcb5c6 Don't mark group attachment as unsynced when opened
For group items, attachmentLastRead is stored in a synced setting in My
Library rather than on the item itself, but since we didn't pass
skipSyncedUpdate, the item was being marked as needing sync, resulting
in a permission-denied error in read-only libraries.

https://forums.zotero.org/discussion/131717/opening-pdf-in-read-only-group-library-triggers-permission-denied-on-sync
(cherry picked from commit d2631cc614)
2026-05-21 10:08:07 -04:00
abaevbog
b5517e92c1 citation dlg: sort libraries by cited count (#5925)
In list mode, sort libraries by the count of their items
cited in the current document, falling back to alphabetic sorting
when counts are equal, with "My Library" always getting
priority over other groups.

Fixes: #5924
(cherry picked from commit 8f44172342)
2026-05-21 10:07:52 -04:00
Abe Jellinek
adacbb4010 Fix Find Full Text captcha loop on ScienceDirect (#5902)
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-05-05 09:51:23 -04:00
Dan Stillman
df6efbfd8d Update translate submodule 2026-05-05 09:51:04 -04:00
Abe Jellinek
de5bc7c5c5 cookieContextId -> userContextId 2026-05-05 09:51:04 -04:00
Abe Jellinek
5ebe8ea15f Add support for clearing challenge in browser during translation 2026-05-05 09:51:03 -04:00
Abe Jellinek
b8611db419 Remove CookieSandbox, add new utility for cookie isolation (#5853) 2026-05-05 09:49:42 -04:00
Dan Stillman
86ae532c37 Prefs: Localize "Data Directory:" label in Advanced pane
Hard-coded as "Data directory:" in the original commit. Move to Fluent
and fix the dara-dir-label typo on the id (and the matching
aria-describedby) while we're here.

https://forums.zotero.org/discussion/130868/untranslated-string-data-directory
https://forums.zotero.org/discussion/131212/translation-not-reflected
(cherry picked from commit a57cb6276f)
2026-04-30 12:19:00 -04:00
Abe Jellinek
33e6601a2e Server: Remove /connector/request endpoint
Never used.

(cherry picked from commit 13cb8d99b6)
2026-04-30 12:18:45 -04:00
Abe Jellinek
9db626c929 Server: Close request without response when browser is detected
(cherry picked from commit bc2ede0459)
2026-04-30 12:18:38 -04:00
Abe Jellinek
8579339cde Server: Improve browser detection
(cherry picked from commit 2e19017d0e)
2026-04-30 12:18:35 -04:00
Abe Jellinek
094eb92f37 CasePreservingHeaders: Fix some Headers instances not being recognized
I guess the Headers class accessible from test code is different from
the Headers class in http.js (for the purposes of instanceof, at least).

(cherry picked from commit 2f38926da5)
2026-04-30 12:18:31 -04:00
Dan Stillman
ed5418b8f8 Validate Host header in connector server
Restores a check that was originally added in 10ad4c33 but lost in the
June 2024 server rewrite (#5148)

(cherry picked from commit 5dc817db44)
2026-04-30 12:18:28 -04:00
windingwind
5a745fcc9a Fix plugin FTL registration (#5896)
Use one registry to avoid competing of language detect between plugins,
as resources declared as optional is identical to resource missing and thus fails the check and returns null for the string (https://searchfox.org/mozilla-esr140/source/intl/l10n/rust/l10nregistry-rs/src/registry/asynchronous.rs#140)
Register the plugin FTL for all languages Zotero supports with proper fallback logic so that even resources are declared as required, the check doesn't fail when plugin doesn't provide the resource.
Fix Zotero.File.getResourceAsync to use NetUtil channel to handle jar: url with `@`.

(cherry picked from commit e13e85b2e5)
2026-04-30 12:18:03 -04:00
Dan Stillman
d27da1173a Offer to reset data directory on SQLite I/O error at startup
When a custom data directory is on a network share or in a cloud storage
folder, SQLite can fail to open with NS_ERROR_STORAGE_IOERR and the user
previously had to manually edit prefs.js to recover. Show a "Use Default
Location" button in the startup error dialog that resets the data
directory pref and restarts.

Addresses #4860

(cherry picked from commit 0b15b794e6)
2026-04-23 22:19:26 -04:00
Tom Najdek
2d6268919b Fix tag paste to include existing field text at cursor position (#5873)
(cherry picked from commit 32e43cb8f1)
2026-04-21 12:20:55 -04:00
windingwind
3db96c9444 Fix plugin prefs.js change not taking effect after update (#5888)
Do not use cache for loading the prefs.js

(cherry picked from commit fa9a54b773)
2026-04-21 12:15:52 -04:00
Adomas Venčkauskas
83ec579d3d Fix bad utilities submodule commit
(cherry picked from commit 26816b03e2)
2026-04-21 12:15:42 -04:00
Adomas Venčkauskas
3acb7e1f6b Update utilities submodule
(cherry picked from commit 07906931c1)
2026-04-21 12:15:37 -04:00
Dan Stillman
a3ff0f96e5 Work around Fluent issue leaving "{$version}" in post-upgrade banner
Some users see the literal "{$version}" placeholder in the banner,
likely due to some Fluent quirk triggered by plugin localizations.
(Missing localizations? Missing strings?) After translation, check the
version span and substitute manually if needed.

https://forums.zotero.org/discussion/129171/version-variable-is-displayed-in-zotero-8-upgrade-banner/p1
https://forums.zotero.org/discussion/130864/just-upgraded-to-zotero-9-on-debian-through-check-for-updates-and/p1
(cherry picked from commit 45596e70e9)
2026-04-21 12:14:41 -04:00
windingwind
e943914541 Fix removal logic for menu added by MenuManager (#5886)
Add the registered main key to menu class list so that they can be found when plugin is removed.
Add test for the fix.

(cherry picked from commit 55672ba933)
2026-04-21 12:14:04 -04:00
Abe Jellinek
6631250aa4 Read Aloud: Handle failure when trying to pause other tab
https://forums.zotero.org/discussion/130920/tts-breaks-after-automatic-theme-changes
(cherry picked from commit 488fd29978)
2026-04-21 12:13:58 -04:00
abaevbog
272da7499b fix related item sometimes not selected on click (#5885)
https://forums.zotero.org/discussion/130887/clicking-related-fails-zotero-report-id-1418809492
(cherry picked from commit 683ecf1620)
2026-04-21 12:13:18 -04:00
Dan Stillman
68dff74298 Fix crash when annotation item is missing itemAnnotations row
Don't throw when updateDisplayTitle() retry fails after loading
annotation data for a corrupt item. Also add an integrity check to
delete annotation items without itemAnnotations rows.

Fixes https://forums.zotero.org/discussion/130872

(cherry picked from commit f20eb5b566)
2026-04-21 12:13:03 -04:00
Dan Stillman
e22e2cd9dd Fix hardcoded version in post-upgrade banner 2026-04-10 11:21:20 -04:00
Abe Jellinek
3e04f5e3e7 Enable Read Aloud in stable builds
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
2026-04-09 15:35:02 -04:00
Dan Stillman
f82efc766d Fix Added/Modified By visibility when switching between library types
The `_getColumns()` column cache key didn't account for library type, so
switching between personal and group libraries reused cached columns
from the previous library type. This caused `groupLibrariesOnly` columns
(Added By, Modified By) to be missing in group libraries or incorrectly
shown in personal libraries.

Additionally, `VirtualizedTable.componentDidUpdate()` only recreated its
internal `Columns` object when the id prop changed, not when the columns
prop changed, so even with correct column rebuilding in `ItemTree`, the
table wouldn't pick up the new column list.

https://forums.zotero.org/discussion/130521/added-by-column-missing
2026-04-09 11:29:02 -04:00
Dan Stillman
117fa1dddb Update citeproc.js to include Juris-M/citeproc-js#275 2026-04-08 11:19:01 -04:00
Abe Jellinek
4b14ca9af4
Set Recently Read threshold relative to most recent item (#5878)
Some checks are pending
CI / Build, Upload, Test (push) Waiting to run
And persist cutoff within session
2026-04-07 14:10:18 -04:00
Mi Ramon
5671a724e8
Fix broken Find option under Edit menu in reader (#5877) 2026-04-07 10:38:50 -04:00
Dan Stillman
3f0de027a2 Auto-resolve lastRead sync conflicts by picking the most recent value 2026-04-07 10:29:25 -04:00
Dan Stillman
67288047f3 Use APFS cloning for file copies on macOS
Add Zotero.File.copyFile(), which uses clonefile() on APFS with a
fallback to IOUtils.copy(), and use it for all significant file copies.
APFS is detected and cached for each parent folder via
Zotero.File.isAPFS(), which uses statfs().

On APFS, all database backups now use the offline (close/clone/reopen)
path instead of the SQLite online backup API. Cloning is nearly
instant, and backup files share disk blocks via copy-on-write, saving
potentially gigabytes of space.

Closes #5330
2026-04-03 14:33:21 -04:00
Dan Stillman
92c876e47d Fix switching-accounts error on loginCancelled from stream server
Only resolve for known events, matching the polling behavior.
2026-04-03 12:17:03 -04:00
Dan Stillman
7f9fdc0786 Update translators, styles, CSL locales, and renamed-styles.json 2026-04-02 15:51:43 -04:00
Dan Stillman
0ff3ec6a1b Move file renaming strings to fileRenaming.ftl
Move file-renaming-* and rename-files-preview-* strings from zotero.ftl
to a dedicated fileRenaming.ftl. Rename rename-files-preview-* keys to
file-renaming-preview-window-* for consistency.
2026-04-02 15:48:14 -04:00
Tom Najdek
862573eabc
Per-group file renaming settings (#5862)
Also:

- Add `isAdmin` property to libraries
 
---------

Co-authored-by: Dan Stillman <dstillman@zotero.org>
2026-04-02 15:15:06 -04:00
abaevbog
c6a95fd5b7
citation dlg: fix CI test breakage (#5870)
- prevent the focus handler from resetting the cached
items in search handler
- wait for search to finish after changing dialog type
in "should not display empty note child rows" test
2026-04-02 11:27:43 -04:00
abaevbog
6f5f221db0
citation dlg: no irrelevant child rows in itemTree (#5863)
Pass filterChildItems to itemTree from citationDialog
to filter out unwanted child rows before adding them
in toggleOpenState.

In annotations mode, do not add child notes and
attachments without annotations
In add-note mode, only keep child notes that have content
2026-04-01 14:05:40 -04:00
Bogdan Abaev
df18ac4e1f citation dlg: updated icons
- updated annotations dialog type icons for dark and light mode
- use checkmark instead of right arrow for "accept" button
- fix incorrect sizing of "accept" and "cancel" icons
2026-03-31 14:53:11 -04:00
Bogdan Abaev
0e7ed13a43 citation dlg: variable min-width for list/library
- Allow different min-width for list vs library layouts.
In library mode, we need at least 1000px to have a functional
itemTree, especially when sidepane is present. But for list
mode, 1000px is very wide, so min-width should be 800px.
Increased min-height of itemTree from 200px to 400px
- When the dialog closes, store the width/height of
the current dialog's layout. Then, when the dialog opens
next time in that layout, set window's width/height based on last saved
params. That way, one can open a citation dialog in list
mode at 800px, then open annotations dialog (always library mode)
at 1000px, and then have the citation dialog in list mode open
again at its intended 800px.
- If one switches from library to list mode, add a smooth
window resizing animation to shrink diagonally from current width
to 800px. If one switches from list to library mode,
window smoothly resizes to 1000px min-width. This is
not applied to linux where win resizing behavior is a bit jumpy.
2026-03-31 14:53:11 -04:00
Mi Ramon
5f942684b6
fix: indentation for some settings items is not taking effect on Windows (#5867) 2026-03-30 16:49:18 -04:00
Tom Najdek
2ad4618efb
Exclude ©, ®, and ™ from emoji detection regex 2026-03-29 17:51:27 +02:00
Abe Jellinek
fb8389d654
Read Aloud: Persist last-read position in synced setting (#5860) 2026-03-27 15:22:02 -04:00
Dan Stillman
391e8497a6 Handle per-object 403 on settings upload and reset to remote version
If the server returns a write report with 403 for admin-only settings,
mark successful settings as synced and reset rejected settings to
their remote values by re-downloading from the server.

Needed for #5862
2026-03-26 15:54:28 -04:00
Dan Stillman
16380e4a19 Pass includeEmails=1 in /keys request when opening Sync settings 2026-03-26 13:11:26 -04:00
Dan Stillman
6140088b0c Swap order of annotation and note buttons in citation dialog 2026-03-25 13:14:12 -04:00
abaevbog
1d437d88f0
citation dialog: insert annotations followup (#5858)
- fix breakage when initially setting annotation dialog
   mode to library
- on click of a non-annotation item in suggested items,
   select the top-level library if the item could not be selected
   in the initial state of the itemTree
- increase min-width of the dialog to 1000px to ensure
   there's always space for the sidebar.
2026-03-24 21:07:19 -04:00
Dan Stillman
8167c903f3 Fix WebSocket 4409 error on sync logout
Properly remove the sync streaming subscription before clearing the
API key on logout.
2026-03-24 12:09:15 -04:00
Dan Stillman
322b764091 Show email addresses in sync settings
Fetch emails from /keys response and login session result, persist them
in the local database, and display them in the sync settings for both
logged-in and logged-out-but-linked states.

Also unify the separate logged-out-linked and logged-in containers into
a single layout that toggles elements based on login state.

Requires dataserver and stream-server changes
2026-03-24 12:09:08 -04:00