Skip to content

Release 0.15.1 - #93

Open
NZBMan wants to merge 163 commits into
mainfrom
release-0.15.1
Open

NZBMan wants to merge 163 commits into
mainfrom
release-0.15.1

Conversation

@NZBMan

@NZBMan NZBMan commented Oct 13, 2026

Copy link
Copy Markdown
Contributor

No description provided.

NZBMan added 18 commits October 11, 2026 21:51
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.
…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.
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 13, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-16T20:34:37.332081Z a788e80 New commits
🔒 Security Review ✅ Completed 2026-10-13T17:18:07.016133Z 0c7f842 PR opened
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread server/crates/weaver-server-core/src/post_processing/runner.rs
Comment thread server/app/weaver/src/http/nzbget.rs Outdated
Comment thread server/app/weaver/src/http/tests/nzbget_version_uses_jsonrpc.rs Dismissed
Comment thread server/app/weaver/src/http/tests/nzbget_version_uses_jsonrpc.rs Dismissed
Comment thread server/app/weaver/src/http/tests/nzbget_version_uses_jsonrpc.rs Dismissed
…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.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread server/crates/weaver-server-core/src/proxies/routed_http.rs
Comment thread e2e/internal/weaver/advanced_networking.go Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread server/crates/weaver-server-core/src/application_upgrade/service.rs

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment thread e2e/playwright-weaver/tests/proxy-routing.spec.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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);

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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()?;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

);
}
}
for credential in ["control-key", "session-token", "browser-session-token"] {
app.clone()
.oneshot(json_post(
"/weaver/jsonrpc",
Some(&basic_auth("control-key")),
&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");
NZBMan added 13 commits October 16, 2026 06:46
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.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 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".

Comment on lines +148 to +149
.and_then(|ping| base.join(ping.trim_start_matches('/')).ok())
.map(|ping| ping.to_string());

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge 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 👍 / 👎.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants