github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

docs: update wiki.dreamwidth.net refs (#3539) (#3702)

  • docs: update wiki.dreamwidth.net refs (#3539)

  • docs: update wiki.dreamwidth.net refs (#3539); see PR comment re: hack.dreamwidth.net and CLA

  • Format theme documentation reference

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Add bluesky to profile_services (#3707)

Commit: dad752a1 Author: Joshua Barrett

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Add squidgeworld as an external site (#3703) (#3706)

Squidgeworld is getting a lot of attention after the AO3 outage, so it has been added as external site that can be [personal profile] mentioned. Additionally, ao3's service type has been changed.

CODE TOUR: You can [personal profile] mention users on squidgeworld now, using @[Unknown site tag].squidgeworld.org, @[Unknown site tag].squidgeworld, @[Unknown site tag].squidge, or @[Unknown site tag].sqwa

Commit: b1080f61 Author: Joshua Barrett

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Bump sass in /etc/build-tools in the build-tools group (#3708)

Bumps the build-tools group in /etc/build-tools with 1 update: sass.

Updates sass from 1.105.1 to 1.107.0 - Release notes - Changelog - Commits

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Fix typos and copy-pasted S2 parser comments (#3701)

  • CustomizeTheme.pm: "reseting" -> "resetting".
  • SendEmail.pm: "duplicant" -> "duplicate".
  • S2 NodeClass.pm and NodeClassVarDecl.pm: both parse() methods carried a "# get the function keyword" comment copied from NodeFunction.pm, but they require TokenKeyword::CLASS and TokenKeyword::VAR respectively.

Comments only, no functional change.

Signed-off-by: Léon Avic Simmons Avicennasis@gmail.com

Commit: a60c4142 Author: Léon Simmons

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Show a helpful login error for email addresses (#3710)

  • Show a helpful login error for email addresses

Fixes #3709

  • Remove granular login error message tests

  • Let complete email input reach login validation

Commit: 42028595 Author: Mark Smith

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Change the logged-in account's password on /changepassword (#3705)

When logged in, the page showed an editable username field, so a browser that autofilled another saved login would change that account's password instead. The page now shows the logged-in account as fixed text and the handler always targets it; the username field remains for logged-out use.

Co-authored-by: Claude Opus 5.5 noreply@anthropic.com

Commit: beeae141 Author: Mark Smith

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Validate thread arguments used in comment links (#3704)

destination_thread and thread are now reduced to numeric thread ids before they're used to build the expand, reply and edit links on entry pages, and Comment::expand_link escapes the URLs it emits.

Co-authored-by: Claude Opus 5.5 noreply@anthropic.com

Commit: 2bcb855e Author: Mark Smith

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Make jbackup.pl resilient to throttling and interruptions (#3620)

  • Make jbackup.pl resilient to throttling and interruptions on large journals

  • Add adaptive pacing that will prevent more throttling

  • Allow the default 1000 comments to be lowered with a parameter

  • Make skipped/failed comment_body backups more resilient

  • Update help check to see --backfill

  • Fix jbackup's retry, skip and backfill handling

--backfill dropped a skipped window's marker before fetching it, so an interrupted backfill silently lost whatever it hadn't reached yet. The marker now moves forward only as each part is saved, and a part that still fails keeps a marker of its own. Backfill also resumes from like the main comment loop, which now shares the same window fetcher.

XML-RPC faults were all retried with backoffs that took about half an hour to give up, including a bad password (each retry another failed login) and the server's repeated-request lockout. Only read-only, rate-limit and server errors are retried now; anything else aborts at once. A failed getchallenge also no longer runs the requested method twice.

Other fixes: - prompt for the password with --backfill as well as --sync - wait at least as long as a 429's Retry-After, and cap XML-RPC backoffs with max_backoff like comment fetches - don't retry comment fetch errors other than 429 and 5xx, and count empty responses as tries - stop recording metadata failures as backfillable gaps - document --backfill, the ~/.jbackup settings and skipped:windows, and drop the settings nobody needs to tune

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Fix protocol sync, export batching, and protocol rate limiting for backup clients (#3698)

  • Fix first-ever syncitems/getevents under strict sql_mode

With no lastsync, syncitems and getevents(selecttype=syncitems) compared logtime against '0000-00-00 00:00:00'. Strict sql_mode (NO_ZERO_DATE) rejects that date with an error, which DBI turned into an empty result, so a client's first sync returned no entries. Use MySQL's minimum valid DATETIME instead, and treat a client-supplied zero date the same way.

t/protocol-sync-floor.t covers both modes; t/auth-client-compat.t no longer needs to pre-seed lastsync to work around this.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

  • Install Term::ReadKey in the devcontainer

t/auth-client-compat.t runs the shipped jbackup, which needs Term::ReadKey, and skips itself without it, so it never ran in CI or a fresh devcontainer. Install it in the devcontainer image only; it's a client dependency, not a site one.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

  • Load comment_body export data in batches

comment_body loaded the posters, text and props for its whole window at once, and loaded text even for comments it then printed without it. Load them 250 comments at a time, apply the suspended-poster filter first, and skip text for deleted comments. The output is unchanged for every window; t/export-comments.t compares it with the previous rendering across batch boundaries, long, deleted, screened and suspended-poster comments, and runs the shipped jbackup end to end.

jbackup and the content importer step through comment_body windows by a fixed amount. They now resume from a if a server ever sends one, so a server that cut a window short wouldn't make them skip comments. Dreamwidth doesn't send it today.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

  • Rate limit authenticated protocol requests per user

XML-RPC and flat clients authenticate in the request body, so the rate-limit middleware treated every call as anonymous and limited it to 30/min per IP. Defer those requests to the protocol, which charges each one once it knows who is calling: successful logins to the user's bucket, failed ones to the anonymous per-IP bucket, getchallenge to its own per-IP bucket. A per-IP backstop still applies before any work is done, and over-limit calls get the same 429 and Retry-After as before.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Jitter the syndication check interval after successful fetches (#3697)

delay() adds up to 10% jitter to checknext, but the successful-fetch path in process_content set checknext to exactly NOW() + interval. With the weekly inactive interval, feeds fetched together stayed in lockstep and all came due again at the same moment.

Factor the jitter into LJ::SynSuck::jitter() and use it from both delay() and process_content, before logging so the log shows the real delay.

Co-authored-by: Claude Opus 5.5 noreply@anthropic.com

Commit: 56c07688 Author: Mark Smith

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Back off syndication checks for feeds with no active readers (#3694)

Feeds with no watchers, or only watchers who are deleted/suspended or haven't been active in 180 days, now get their next check scheduled a week out instead of every hour (or day). Failing feeds with no active readers also wait at least that long between retries; failcount bookkeeping is unchanged. Active-reader detection stops at the first active watcher and assumes active after 50 probes. Newly watching a feed resets checknext so the new reader gets fresh content soon.

Adds dw.synsuck.* metrics for checks, readership class, interval bucket and wake-ups, and tunables $LJ::SYNSUCK_INACTIVE_{READER_DAYS,INTERVAL} and $LJ::SYNSUCK_ACTIVE_READER_PROBES.

Co-authored-by: Claude Opus 5.5 noreply@anthropic.com

Commit: 9996423b Author: Mark Smith

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Allow create_trust_group without an id (#3695)

Commit: 5b94d050 Author: Mark Smith

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Allow embedding videos from sendvid (#3614)

  • Add sendvid to embed whitelist and add test for it

  • Update embed whitelist test plan and add a sendvid negative test

The sendvid test was added without bumping the plan count, and main has since added makertube, so the file planned too few tests. Also check that a sendvid watch page (not an /embed/ URL) is rejected.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Updates to new build script (#3531)

-Adds '--target=es6' to esbuild call so that esbuild doesn't use transforms that break in older browsers when minifying code -Minifies all CSS when requested, not just compiled SASS files -Adds '--force' flag to force a complete recompile/resync of static assets, which is automatically on in prod -Adds '--prod' flag so that dev environments get uncompressed JS/CSS by default to aid debugging

Co-authored-by: Cocoa momijizukamori@gmail.com Co-authored-by: Mark Smith mark@dreamwidth.org Co-authored-by: Claude Opus 5.5 noreply@anthropic.com

Commit: 3f4f10b3 Author: momijizukamori

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Add a REST API test suite and fix the bugs it found (#3693)

  • Regenerate api/dist with the current build tooling

The committed dist files were generated by an older version of the yaml package, so any rebuild rewrites all of them with different anchor placement and key quoting. Regenerate them from the unchanged sources now, so later spec changes show up as small diffs. The content of every file is unchanged; only the formatting differs.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

  • Add an end-to-end test suite for the REST API

Nothing exercised the REST controllers, which is how #3687 and #3691 reached users. The new t/plack-api-.t tests send real requests through app.psgi with a temporary user's API key (helpers in t/lib/DW/Test/API.pm), so routing, key auth, spec validation, rate limiting, controllers and backends are all covered. They run in CI's existing plack- step.

t/entry-to-json.t and t/proto-edit-tags.t test LJ::Entry::TO_JSON and arrayref taglists in postevent/editevent directly, and are added to CI's posting step. They include regression tests for #3687 and #3691.

Cases that currently fail are marked TODO; the following commits fix them.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

  • Keep omitted fields when editing entries through the API

The API treats a field left out of an edit as unchanged, but formto_backend read "missing" as "off". A text-only edit removed the entry's tags, age restriction, backdating, comment settings and slug, and reset a custom access filter's mask to 0. When editing, fall back to the entry's current value for each of those fields.

Edits now honour datetime, which was documented but ignored, and keep the current date when it's left out. text is optional on edit as the spec says, and an explicit empty subject clears the subject. The spec now describes these semantics and the 200 response edits already returned, and documents that count is capped at the site's scrollback limit.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

  • Tighten API key validation

Only return a key from DW::API::Key::get_key when its account is active. The check runs on every lookup, after the cached key data is read, so a change to the account takes effect immediately.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

  • Return valid error statuses from the entry edit and tag endpoints

Two rest_error calls passed an HTTP method name as the status code, so responses went out with a status of "POST" or "GET". A maintainer editing someone else's entry now gets a 403 with a message.

Creating tags only reported an error when two or more tags failed, and reused one error buffer for every tag. Now any failed tag makes the request a 400 that carries the error messages. Protocol errors on edit, such as an invalid date, return 400 as they do when posting, instead of 500.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

  • Fix accesslist editing, deletion, and id validation in the API

Adding journals to an accesslist read $body->{journals}, but the spec's body is a plain array of usernames, so every request died with a 500. The endpoint now reads the array and responds with the updated list, as the spec documents.

Deleting an accesslist passed a hashref to delete_trust_group, which takes a list, so nothing was ever deleted even though the response was 204. trust_groups was called the same way, so its existence checks always passed. Deleting a missing list is now a 404, and fetching an unused one is a 400.

Ids outside 1-60 made trust_groups die, which caused 500s; the spec now bounds them, so they are rejected as 400s.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

  • Harden REST request handling

Require the Bearer scheme in the Authorization header, matched case-insensitively as RFC 6750 and RFC 9110 11.1 specify. Before, any header that happened to contain a key was accepted, and "bearer" in lowercase was rejected.

Anchor REST route patterns at the start as well as the end, so routes no longer match under arbitrary prefixes such as /api/v1/x/spec.

Request bodies in a content type the spec has no schema for now get a 415, instead of dying in validation with a 500. Missing required bodies and invalid JSON get a 400 that says what went wrong, and validation errors include their messages, which were always empty before. Bodies for creating entries, tags and accesslists are now marked required in the spec.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

  • Validate tags given as a list before posting or editing

The REST API sends tags as an arrayref, but common_event_validation checked the taglist before it was joined, so the stringified reference always passed. Invalid tags in a list were silently dropped, and the request still succeeded. Join the list at the start of common_event_validation, so lists get error 211 the same way tag strings do. That makes the separate arrayref handling in postevent and editevent redundant, so remove it.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Tweaks and clean-up for the account-switcher (#3692)

  • Clean up the control strip HTML/CSS some

  • Clean up my editing attempts, too

  • Various visual updates for the account-switcher

  • Fix account-switcher layout and tidy up the shared component

Restore the switch-account-form class so the existing site-scheme spacing rules apply again on Foundation and non-Foundation pages, drop the component stylesheet that was never loaded, scope the control-strip switcher rules by class instead of an ID, and only compute display HTML where it is rendered. Also remove the now-unused sitescheme switcher strings, restore a fallback panel background, and add render tests for both callers of the shared component.

Co-Authored-By: Claude Opus 5.5 noreply@anthropic.com

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Accept tags as an array when editing entries through the API (#3691)

editevent treated the taglist as a string, so the arrayref the REST API sends was saved as a single tag like "array(0x...)". Join it the same way postevent already does.

Fixes #3689.

Commit: f664de2a Author: Drue Wilding

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Fix 500 from REST API for access-locked entries (#3687)

LJ::Entry::TO_JSON assigned to method calls on a plain hashref for usemask entries, which died. Use hash access, and return custom_groups as an array rather than a count.

Fixes #3686.

Commit: 9e657df5 Author: Drue Wilding

github: shadowy octopus with the head of a robot, emblazoned with the Dreamwidth swirl (Default)
[personal profile] github

Keep accounts in the switcher across logout and account creation (#3683)

  • Keep accounts in the switcher across logout and account creation

Logging out of the active account now leaves it listed in the account switcher as signed out, instead of dropping it, while still handing off to the next usable account. A logout that leaves nothing to switch to keeps the list unless it only ever held that one account.

/logout gains "Log Out of All Accounts", which ends every session in the browser and either keeps the accounts listed (signed out) or, if asked, forgets them. Creating an account while logged in now demotes the current account into the switcher rather than silently replacing it, and /manage/accounts links to account creation and logout.

Co-Authored-By: Claude Opus 5.5 (1M context) noreply@anthropic.com

  • Abort logout when a session can't be revoked

Logging out now destroys stored sessions by their handle rather than only when they validate from the current request, so an IP-bound session from another network is revoked too. If a session can't be destroyed, logout stops before handing off or rewriting cookies, and the page reports the failure. The log-out-all option only appears when another account is actually signed in.

Co-Authored-By: Claude Opus 5.5 (1M context) noreply@anthropic.com

Profile

Dreamwidth Changelog

November 2026

S M T W T F S
12 34567
891011121314
15161718192021
22232425262728
2930     

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Nov. 4th, 2026 08:40 pm
Powered by Dreamwidth Studios