| c651c34b | 17-Jun-2026 |
Andreas Gohr <gohr@cosmocode.de> |
BacklinksTest: give testLinksInDeletedPages its own page
testLinksInDeletedPages reused test:internallinks, the same page testInternallink already saves and indexes. Since the data dir is shared acr
BacklinksTest: give testLinksInDeletedPages its own page
testLinksInDeletedPages reused test:internallinks, the same page testInternallink already saves and indexes. Since the data dir is shared across the class, when the re-save and the earlier index land in the same second, needsIndexing() now (correctly) reports the page as up to date and addPage() skips reindexing, leaving stale link data. backlinks('test:internallink') then returned an empty array.
Use a dedicated page (test:deletedlinks) with its own link targets so the test no longer collides with testInternallink's index state.
show more ...
|
| 2cda0166 | 17-Jun-2026 |
Andreas Gohr <gohr@cosmocode.de> |
Indexer: signal nothing-to-do via boolean return instead of void
The TaskRunner runs indexing, sitemap, digest and changelog-trim tasks in sequence and relies on each task returning false when it di
Indexer: signal nothing-to-do via boolean return instead of void
The TaskRunner runs indexing, sitemap, digest and changelog-trim tasks in sequence and relies on each task returning false when it did no work so the next one is tried. The indexer rewrite changed addPage(), deletePage() and renamePage() to return void and only abort via exceptions, breaking that contract: indexing always looked like work was done and the following tasks never ran.
Restore the boolean return on these three methods (true when work was done, false when there was nothing to do) while still using exceptions to signal errors, and propagate it through TaskRunner::runIndexer(). runIndexer() also no longer forces reindexing on every call.
The legacy compatibility layer is adjusted to match: LegacyIndexer and idx_addPage() forward the boolean, mapping SearchExceptions back to the historic error-message/false returns. LegacyIndexer::renamePage() restores the 'page is not in index' message that the move plugin expects.
Closes #4661
show more ...
|
| 79dae64d | 17-Jun-2026 |
Andreas Gohr <gohr@cosmocode.de> |
Indexer: treat same-second save and index as up to date
needsIndexing() compared the .indexed tag mtime against the page mtime with <=, so a page that was saved and indexed within the same second wa
Indexer: treat same-second save and index as up to date
needsIndexing() compared the .indexed tag mtime against the page mtime with <=, so a page that was saved and indexed within the same second was always reported as still needing indexing. Require the page to be strictly newer than the index tag instead, so an equal mtime correctly counts as up to date.
show more ...
|
| 5d71952d | 16-Jun-2026 |
Andreas Gohr <andi@splitbrain.org> |
Translation update (de) |
| 2ff7e61c | 10-Jun-2026 |
Andreas Gohr <gohr@cosmocode.de> |
fix(indexer): explicitly handle renames
In an attempt to simplify the index handling, the newly refactored indexer implemented a rename as delete+add sequence.
This had unintended consequences for
fix(indexer): explicitly handle renames
In an attempt to simplify the index handling, the newly refactored indexer implemented a rename as delete+add sequence.
This had unintended consequences for the move plugin which may move several pages at once, requiring a working index even while some pages have already been moved while others still remain at their old location.
Related to #4646
show more ...
|
| c959e5ab | 07-Jun-2026 |
splitbrain <86426+splitbrain@users.noreply.github.com> |
Rector and PHPCS fixes |
| 879510b4 | 07-Jun-2026 |
splitbrain <86426+splitbrain@users.noreply.github.com> |
Update deleted files |
| b12755b0 | 07-Jun-2026 |
Andreas Gohr <andi@splitbrain.org> |
Make common_pageinfo tests independent of execution order
The pageinfo() tests relied on running in a fixed order: test_editor_and_externaledits mutated wiki:syntax (changelog entry + file mtime), a
Make common_pageinfo tests independent of execution order
The pageinfo() tests relied on running in a fixed order: test_editor_and_externaledits mutated wiki:syntax (changelog entry + file mtime), and the other tests relied on that page being pristine. Move the mutating test to its own page (wiki:dokuwiki) so the shared per-class data dir stays clean, prime the last_change metadata within each test instead of across tests, and fix the affected expectations. The suite now passes in isolation and in random/reverse order.
While here, modernize the file: - capture the pageinfo() result once instead of calling it twice - add public/protected visibility markers to all methods - convert array() to the short [] syntax - replace the deprecated addLogEntry() with the PageFile API it wraps
show more ...
|
| 3e427828 | 02-Jun-2026 |
Wizzard <wizzardsk@gmail.com> |
Translation update (sk) |
| 54e76260 | 29-May-2026 |
Andreas Gohr <andi@splitbrain.org> |
chore: adjust overlong line |
| 7e687fd8 | 29-May-2026 |
Andreas Gohr <andi@splitbrain.org> |
fix(auth): scope media ACL checks to the namespace
Media files have no per-file ACLs; permissions must be evaluated against the namespace they live in. Several call sites passed the raw media ID to
fix(auth): scope media ACL checks to the namespace
Media files have no per-file ACLs; permissions must be evaluated against the namespace they live in. Several call sites passed the raw media ID to auth_quickaclcheck(), so a page-intended exact-ID rule (e.g. on wiki:secret.png) could silently apply to a media file sharing that ID.
Introduce mediaAclPath() that builds the correct namespace wildcard path (handling root-namespace media) and route all media-related ACL checks through it. Also normalize the lone `:X` sentinel variant in fetch.functions.php to the standard `:*` form.
fixes: #4647
show more ...
|
| 6e39b4e3 | 28-May-2026 |
Andreas Gohr <andi@splitbrain.org> |
refactor(search): extract LegacyIndexer wrapper for BC contract
Move the deprecated helpers (lookupKey, addMetaKeys, renameMetaValue, getPID, lookup) off Indexer and into a new LegacyIndexer wrapper
refactor(search): extract LegacyIndexer wrapper for BC contract
Move the deprecated helpers (lookupKey, addMetaKeys, renameMetaValue, getPID, lookup) off Indexer and into a new LegacyIndexer wrapper. The wrapper also restores the Doku_Indexer return contract (true|string) around addPage/deletePage/renamePage/clear so plugins using the legacy API keep working without try/catch.
idx_get_indexer() now returns the LegacyIndexer; getPages stays on Indexer because plugins call it directly on Indexer instances.
fixes #4645
show more ...
|
| 1dbc46ac | 27-May-2026 |
Tzipirigu <tzipirigu.radu25683@gmail.com> |
Translation update (ro) |
| 08b5f5eb | 14-May-2026 |
Andreas Gohr <andi@splitbrain.org> |
fix(authad): avoid warning when initAdLdap is called before opts is populated
$this->opts is initialized as an empty array, so the is_array() guard in initAdLdap() passed even when no domain had bee
fix(authad): avoid warning when initAdLdap is called before opts is populated
$this->opts is initialized as an empty array, so the is_array() guard in initAdLdap() passed even when no domain had been loaded yet, producing an "Undefined array key 'domain'" warning on PHP 8 (e.g. from getUserCount() called by the Popularity admin page).
Fixes #4501
show more ...
|
| 649695ab | 14-May-2026 |
Andreas Gohr <andi@splitbrain.org> |
fix(infoutils): fix synology os-release file parsing
Only remove comments at the start of the line. Should be enough to make the file parsable enough for what we need.
Fixes #4572 |
| a5debd11 | 14-May-2026 |
Andreas Gohr <andi@splitbrain.org> |
remove valid_input_set(), inline the only remaining callers
The Input::valid() method on $INPUT already provides the cleaner API originally requested in #667. The last two callers in Subscribe.php v
remove valid_input_set(), inline the only remaining callers
The Input::valid() method on $INPUT already provides the cleaner API originally requested in #667. The last two callers in Subscribe.php validated against a local $params array (not $_POST/$_GET) and need to throw a specific exception, so inline a small in_array + throw at those call sites rather than carry the legacy helper.
The class could probably be made cleaner but that's beyond the scope of this change.
Closes #667
show more ...
|
| 8c651031 | 13-May-2026 |
Andreas Gohr <andi@splitbrain.org> |
Update copyright year in README |
| 36ba8ead | 12-May-2026 |
Andreas Gohr <andi@splitbrain.org> |
test: add tests to catch #4637
Issue #4637 was fixed in 7686f2030b19f948d2e50df1613ef6592fa44b46 but I didn't like that no test had caught the issue.
This adds a specific test for the issue as a Ha
test: add tests to catch #4637
Issue #4637 was fixed in 7686f2030b19f948d2e50df1613ef6592fa44b46 but I didn't like that no test had caught the issue.
This adds a specific test for the issue as a HandlerTest. Additionally a simple smoke test is added that renders the wiki:syntax page and inspects the created DOM. It's not comprehensive but might help flagging similar issue in the future.
show more ...
|
| 7686f203 | 12-May-2026 |
Anna Dabrowska <dabrowska@cosmocode.de> |
Fix syntax plugin rendering
Reverse the order in which core modes and plugin modes are handled by the \dokuwiki\Parsing\Handler. Otherwise only the handle() method of the plugin is called, which is
Fix syntax plugin rendering
Reverse the order in which core modes and plugin modes are handled by the \dokuwiki\Parsing\Handler. Otherwise only the handle() method of the plugin is called, which is fine for core modes. Syntax plugins need to go through plugin() to actually add their own calls.
show more ...
|
| 53307a6b | 09-May-2026 |
Andreas Gohr <andi@splitbrain.org> |
Delete inc/Search/concept.txt
The contents have been added to the wiki
|
| 73dc0a89 | 06-May-2026 |
Andreas Gohr <andi@splitbrain.org> |
fix(mail): keep '&' intact in mailto links with multiple query params
Move the email-handling helpers (obfuscate, mail_isvalid, mail_quotedprintable_encode, mail_setup) out of the procedural inc/mai
fix(mail): keep '&' intact in mailto links with multiple query params
Move the email-handling helpers (obfuscate, mail_isvalid, mail_quotedprintable_encode, mail_setup) out of the procedural inc/mail.php into a namespaced dokuwiki\MailUtils class plus a new Mailer::configInit(), and add a separate MailUtils::obfuscateUrl() for the mailto-href context.
The xhtml renderer and PluginTrait now build the link label and the href separately: the address half is run through the mailguard obfuscation, the query string is preserved verbatim with only HTML escaping applied. This fixes #1690 — in 'visible' mode the previous code rawurlencoded the entire address+query, turning '?' into '%3F' and breaking multi-parameter mailto links; in all modes the query string is no longer mangled by the [at]/[dot] substitution.
Core call sites (Mailer, auth, LegacyApiCore, common, the xhtml renderer, the parser, the bundled config/styling/usermanager plugins) are migrated to MailUtils directly. The old top-level functions and PREG_PATTERN_VALID_EMAIL constant remain as deprecated shims with rector mappings.
Tests for obfuscate / mail_isvalid / mail_quotedprintable_encode are consolidated into a single _test/tests/MailUtilsTest.php and extended with regression coverage for the multi-parameter, double-escape and URL-shape cases.
Closes #1690 Replaces #1964
show more ...
|
| 8788dbbd | 06-May-2026 |
splitbrain <86426+splitbrain@users.noreply.github.com> |
Rector and PHPCS fixes |
| 0096805f | 06-May-2026 |
splitbrain <86426+splitbrain@users.noreply.github.com> |
Update deleted files |
| e7ebba47 | 06-May-2026 |
Andreas Gohr <andi@splitbrain.org> |
updated phpseclib dependency |
| 560c6061 | 06-May-2026 |
Andreas Gohr <andi@splitbrain.org> |
use new ModeRegistry constant in info plugin
Basically all syntax plugins could now return the constants instead of plain string, but the info plugin is the only syntax plugin we have directly in co
use new ModeRegistry constant in info plugin
Basically all syntax plugins could now return the constants instead of plain string, but the info plugin is the only syntax plugin we have directly in core.
show more ...
|