Repository navigation
Conversation
append, GroupSetCategory and GroupApplyCategory keep routing by the configured category, but the facade now records the label the client sent and reports it back in listgroups, history and listfiles while the job still sits in that category. Clients that filter by an exact category match no longer lose their jobs when the label differs in case or is an alias.
…rom a kept failure kind
…ters and retry to editqueue
…kens on the facade
…and XML-RPC wide integers
…iles in use A major upgrade ran the new package's InstallValidate while the old tray and the server it supervises were still running, so Windows Installer raised the "applications should be closed" prompt from a hidden msiexec window. In-app and MSI upgrades looked frozen, and silent upgrades left the old binaries running until reboot. The old product's StopTrayBeforeRemoval runs only after that check. Locate the installed tray with AppSearch and ask it to shut down before InstallValidate on upgrades; the shutdown command succeeds when no tray is running and the existing removal actions stay as the fallback. Same defect and fix as Scryer, where the upgrade with a running tray was reproduced and the fixed package verified on a Windows 11 box.
RemoveTrayStartupBeforeRemoval ran whenever the product was removed, and a major upgrade removes the old product as part of installing the new one, so every upgrade silently dropped the user's HKCU Run entry. The tray only registers that entry from its own menu toggle, so the preference was lost until the user noticed and re-enabled it. Guard the action with NOT UPGRADINGPRODUCTCODE, as the profile cleanup already is; the entry points at the install path, which the upgrade keeps.
Codex Review SummaryThis comment shows the latest Codex review activity on this pull request.
ℹ️ About Codex in GitHubYour team has set up Codex to review pull requests in this repo. Reviews are triggered when you
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings. |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0c7f842a20
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
…demand Bandwidth and Usenet speed tests run on a draft of a route with any leg, rung, proxy or egress taken down. Every run pauses and drains downloads first. The Usenet run uses the live fused article fetch and books into the live download counter, so its number is the header's number; the bandwidth run uses the RSS routed GET through the leg's bridge. Runs are one-off and held in memory. Providers: Cloudflare, SABnzbd, OVH, Hetzner, LibreSpeed and a custom URL, each verified live by an ignored probe test. Plan 169.
ST01 Usenet run over a laddered route against the proxy fixture, the same run with the rung downed, and the run booked against a job on the same route; ST02 the queue gate around a run; ST03 cancel. Registered as the speed-test release phase after the four advanced-networking partitions.
…est posting A fixturegen recipe reproducing the reference set from the generator's own bytes under its file names: a 100,000,000-byte member and a one-line text member in four 25 MiB RAR5 volumes (-m3, 32 MiB dictionary, quick-open records) with a 200-block PAR2 set at a 50124-byte slice. Ledgered with generated digests, added to the release-gate profile, and seeded by the speed-test release phase at the reference's 716800-byte article size.
… root with Podman Fixture seeding ran after the staged-flow dispatch, so a staged flow such as speed-test never posted its SeedFixtures. Seed first, and leave the services the seed brought up out of the host-port wait: their ports belong to this stack, not a previous one, and the wait never ended. The gate root was the literal /tmp, which a Podman machine does not share with the host, so a file bind-mounted out of the run directory failed with Not a directory. Resolve the root's symlinks so /tmp becomes /private/tmp.
The proxy fixture takes PROXY_FIXTURE_PUBLIC_TARGETS beside its fixture destinations: hosts it answers for and forwards to. The relay keeps its exclusive allowlist with publicOnly. The speed-test flow resolves speed.cloudflare.com on the host and hands the fixture the addresses, so Weaver resolves the name through the fixture and the rung carries the TLS session out. ST04 runs one stream of the largest size Cloudflare serves, checks the run moved exactly those bytes through the proxy rung, that nothing went direct, that the row and detail show it, and that no byte was booked as downloaded.
…umer The direct store's -hp and -mhe header gates were offered the spec and NZB candidates only, while finalize, probe, topology and nested extraction also tried the global Settings list and the password file. A header-encrypted set keyed only by a global password demoted and redownloaded to be opened by finalize. Pipeline::archive_password_candidates_for_job is now the single helper. It returns the list (Explicit, NzbMeta, FilenameConvention, Settings, PasswordFile, de-duplicated by value) with a completeness flag; the second NZB-only helper is gone. The direct store keeps its per-job memo, so the per-article path stays a map lookup, and caps what reaches a set's header gate at MAX_DIRECT_HEADER_PASSWORD_CANDIDATES to bound KDF work.
ST05 two-leg split, leg down, all-down refusal, compare; ST06 seeded 100 MB posting over a plaintext direct leg; ST07 failed NZB fetch; ST08 maximum duration; ST09 server quota booking and refusal; ST03 also checks the already-running refusal and the disabled Run button.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 78e5af1559
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 16e1b82b50
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 9a07461ada
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: f03482e24d
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| }); | ||
| } | ||
| let configured = pool.configured_connections(index).unwrap_or(0); | ||
| let lent = usize::from(connections).min(configured); |
There was a problem hiding this comment.
Borrow the full speed-test connection count
If an operator lowers this server's connection count while the run is preparing or fetching its NZB, connections still comes from the stale plan while configured comes from the rebuilt live pool. Taking the minimum lends only the new, smaller count, but the unchanged plan.legs later opens the original number of NNTP clients, so the excess connections run outside the pool's socket budget. Refuse or replan the run when the full requested count cannot be lent.
Useful? React with 👍 / 👎.
| if base.scheme() != "https" { | ||
| return None; | ||
| } | ||
| let download = base.join(entry.dl_url.trim_start_matches('/')).ok()?; |
There was a problem hiding this comment.
Reject absolute URLs from LibreSpeed list entries
When the remote list supplies an absolute dlURL, Url::join accepts it unchanged, so an entry such as http://other.example/file bypasses the HTTPS check applied only to base and can make a built-in LibreSpeed run download cleartext from a different host than the one shown to the user. Validate the joined download URL as HTTPS and same-origin with base before retaining the entry.
Useful? React with 👍 / 👎.
| &mut pipeline, | ||
| job_id, | ||
| spec, | ||
| sample_nzb_zstd_with_password("fixture-key"), |
| pipeline.direct_store.set_gate(DirectStoreGate::Enabled); | ||
| let spec = sevenz_job_spec_with_password(&volumes, ARTICLES_PER_VOLUME, "silver"); | ||
| insert_active_job(&mut pipeline, job_id, spec).await; | ||
| let spec = sevenz_job_spec_with_password(&volumes, ARTICLES_PER_VOLUME, "fixture-key"); |
| let temp_dir = tempfile::tempdir().unwrap(); | ||
| let (mut pipeline, _, complete_dir) = new_direct_pipeline(&temp_dir).await; | ||
| pipeline.direct_store.set_gate(DirectStoreGate::Enabled); | ||
| let spec = sevenz_job_spec_with_password(&volumes, ARTICLES_PER_VOLUME, "wrong-key"); |
The router now deciphers AES over Copy in place, under a plain header or one the password opens, so the encrypted-copy and encrypted-header schedule families finalize their set direct instead of demoting. Hold them to the direct route, and count the encrypted header's packed stream among the map slots since admission now reads it.
Edit buttons carry a pencil and paper, Remove and Delete the bin, and Speed test the lightning bolt it has elsewhere; stored backups, archive password clearing and key copying take the icons their actions use elsewhere. The action columns widen to hold the icons on one line.
An egress is the way out to the internet, which a globe says better than an ethernet port.
The routes actions were wider than their column, so the table scrolled at every width. Stored backups take the compact buttons the other settings tables use, and its actions column narrows to hold them.
The runs table holds the chosen route's runs, with no all-routes switch or note. Compare appears once there are two runs to compare.
The Scripts menu reads Configuration, Secrets, Jobs, Runs.
The buttons on proxy and pool lines say Test, as the one that runs it does, and keep their icon.
…ional chase The positional chase looked for the password-required marker in the header parse error's message, which carries no marker, so it never retried an encrypted header with the job's password. The chase failed and the set was extracted conventionally. The retry now reads the error's class.
Enabled is its own column, keeping its switch. Speed test is a button, and an Edit provider button opens the provider as a click on its row does.
…er toggle Provider, proxy, pool, egress and route rows each said what they edit; the row already says that, so the button reads Edit from one shared string. The action tracks shrink to the shorter buttons. Settings tables take a list of centred columns, and the Providers Enabled header and toggle use it.
…at copying requires Every Weaver-authored source file now opens with an SPDX identifier and a copyright line pointing at the repository, as the GPL's own instructions recommend. SQL migrations, configuration, fixtures and vendored code are left as they were. AGENTS.md gains a section for agents reading Weaver from another project: what the license requires of code copied out of it, and the authors' request for credit.
…-rs 0.7.1 Sevenz comes from crates.io again, so the git pin to its pre-release revision goes. 0.28 makes Error non-exhaustive and adds WriterPoisoned; every match on it already ends in a wildcard, and its renderings of block and checksum errors are unchanged, so the text adapters move to the 0.28 pin as they are.
…mber The settings and password-file cases still expected the EncryptedContent refusal, which the direct store stopped raising for AES over COPY when it learned to route those members. They now assert what the NZB-meta case does: the set is not demoted, and the member reaches the output.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: a788e80d98
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| .and_then(|ping| base.join(ping.trim_start_matches('/')).ok()) | ||
| .map(|ping| ping.to_string()); |
There was a problem hiding this comment.
Constrain LibreSpeed ping URLs to their server origin
When the remote list supplies an absolute pingURL, Url::join accepts it unchanged, so selecting “Nearest server” can send its probe to an unrelated host or an unencrypted http:// endpoint rather than the listed HTTPS server. This can select a server based on an unrelated endpoint and violates the HTTPS-only provider contract; validate that the joined ping URL remains HTTPS and same-origin with base before storing it.
Useful? React with 👍 / 👎.
No description provided.