Commit Graph
3298 Commits
Author SHA1 Message Date
Lorenz Leutgeb 7e1cb406bb build/Dockerfile: Bump cargo-zigbuild
This is required for compatiblity with Rust.
releases/1.10.3
2026-09-08 11:26:27 +02:00
Lorenz Leutgeb 3419821106 Release 1.10.3 2026-09-08 10:37:22 +02:00
Lorenz Leutgeb 3fc92f83fe radicle/identity: Remove useless @ binding 2026-09-07 21:13:06 +02:00
Lorenz Leutgeb 63ed389041 flake: Add cargo-msrv to development shell 2026-09-07 21:11:46 +02:00
Lorenz Leutgeb 6fd73f4f7b flake: Update 2026-09-07 21:11:46 +02:00
Lorenz Leutgeb d285eccb23 fetch: Include the founder namespace always
Read the initial identity document from the blob addressed by the
repository ID and include its founder in the set of namespaces to
be fetched.

This lets clones resolve the identity COB root even if the founder
is not a delegate anymore.
2026-09-07 18:54:53 +02:00
Lorenz Leutgeb 90f448241e node/test/e2e: Clone without founder namespace
Add a test that demonstrates erroneous behavior in case the founder of a
repository is not a delegate anymore.

The change in commit 388d985578 changed
the semantics of loading the identity COB so that the founder is now
crucial.
2026-09-07 18:54:43 +02:00
Lorenz Leutgeb a6f938026f CHANGELOG: Fix level of headings and whitespace 2026-09-04 16:14:08 +02:00
Steven RooseandLorenz Leutgeb 919d5c780c crypto: Error on empty SSH_AUTH_SOCK
The empty string will never give a useful socket.

Co-authored-by: Lorenz Leutgeb <lorenz.leutgeb@radicle.dev>
2026-09-04 13:58:57 +02:00
Lorenz Leutgeb 50129a7179 radicle/canonical: Remove dangling reference
An oversight in commit `218ba30d73adbab0c2c51c6`.
2026-09-04 13:58:53 +02:00
Steven RooseandLorenz Leutgeb ba4ca69404 Add .editorconfig
Co-authored-by: Lorenz Leutgeb <lorenz.leutgeb@radicle.dev>
2026-09-04 13:45:43 +02:00
Daniel NormanandLorenz Leutgeb 218ba30d73 radicle/canonical: Introduce RawSymbolicRefs
Serialization and deserialization of symbolic references was implemented
with assumptions on the order of pairs of key and value in JSON objects,
and further, that the enabling the `preserve_order` of `serde_json` would
always guarante that these assumptions hold. See
<https://docs.rs/crate/serde_json/1.0.149/features#preserve_order>.

This is mistaken. The identity document is serialized via `Doc::encode`
which uses `radicle::…::CanonicalFormatter`, which enforces a particular
ordering. From the point of view of the implementation of symbolic
references, this means that the ordering changes, thus violating the
ordering assumption.
The effects are that during deserialization, some symbolic references
might be considered dangling, when they are only missing other symbolic
references that were reordered to occur "later" in the JSON object.

To remedy, introduce `RawSymbolicRefs`, in analogy to `RawRules`. Just
like `RawRules` may be converted to `Rules`, `RawSymbolicRefs` may be
converted to `SymbolicRefs`. This gives the most flexibility for
handling `RawSymbolicRefs`, and one clear point at which validation
happens.

The fact that the implementation cannot depend on ordering anymore means
that all symbolic references have to be validated together, which fits
the pattern of `Raw{,*}` well.

Tests expose the issue.

Co-authored-by: Lorenz Leutgeb <lorenz.leutgeb@radicle.dev>
2026-09-03 16:47:46 +02:00
Lorenz Leutgeb 0c2e8c1511 radicle/config: Remove public_seeds
This function is unused.
2026-09-02 17:14:04 +02:00
Lorenz Leutgeb 5790e319d0 radicle/config: Do not populate preferred_seeds
Adding the "public seeds" of the network to the `preferred_seeds`
configuration on all nodes causes all nodes to connect to the preferred
seeds and to have them attempt to keep the connection open at all times.

Assuming some growth in the network, and no growth in the number of
"public seeds", this means that the number of inbound connections to the
public seeds grows as well. Once the public seeds are at capacity,
the network as a whole is in some sense bottlenecked by the capacity of
the public seeds: As the network grows further, more and more outbound
connections to the public seeds will fail.

To avoid such issues, do not populate `preferred_seeds`.
2026-09-02 17:14:04 +02:00
Fintan Halpenny 8677fd9ef0 treewide: Update gix-packetline to 0.21.5
[Advisory Report].

[Advisory Report]: https://github.com/GitoxideLabs/gitoxide/security/advisories/GHSA-2vh6-hw4j-32ww
2026-09-02 08:17:16 +01:00
Lorenz Leutgeb c14346d93a radicle/canonical: Remove MatchedRule
This `struct` is unused.
2026-09-01 19:41:02 +02:00
Daniel NormanandLorenz Leutgeb 4867917f37 radicle/canonical: Remove RawRules::matches
Testing revealed that the implementation violated RIP-0006, which
requires the most specific rule matching the target of `HEAD`
to use an `allow` of `delegates` and the document threshold.
`validate_head_rule` took the first match from `RawRules`, which orders
patterns lexicographically, so a glob could be validated in place of the
rule that actually governs the branch.
The issue here is that the correct order for matching patterns is only
guaranteed on `Rules`, but not on `RawRules`.

To prevent such errors in the future, remove `RawRules::matches`. This
requires some refactoring, and makes synthesis of the default branch
rule slightly less efficient in the worst case, but we are willing to
take that hit for a cleaner implementation.

Co-authored-by: Lorenz Leutgeb <lorenz.leutgeb@radicle.dev>
2026-09-01 19:41:02 +02:00
Lorenz Leutgeb fd4e4903d7 radicle, cli: Move Git versions
Move `struct Version` from `radicle` to `radicle-cli`, where it is used.
2026-08-30 23:53:25 +02:00
Lorenz Leutgeb 05a192daff fetch: Do not pretend to be Git
There is no good reason to fake being Git.
2026-08-30 23:53:25 +02:00
Lorenz Leutgeb 2747c52beb remote-helper: Compute HEAD for user namespaces
If a user pushes to the reference of the same name as the default branch
according to the identity document, expose this as `HEAD`, too.
2026-08-30 17:37:09 +02:00
Lorenz Leutgeb fba60164f0 radicle/identity/doc: LazyLock for PayloadId
The functions `PayloadId::{project,canonical_refs}` have two
weaknesses:
 1. They always execute the checks in `from_str` for the same
    `str` over and over again.
 2. They do not return a reference, thus, callers that only
    need a reference make a copy that they then discard.

For improved performance, switch to `LazyLocks`. Keep the less efficient
functions, but deprecate them.
2026-08-30 17:37:09 +02:00
Lorenz Leutgeb 138404df6f radicle: Rely less on ….project payload
Many codepaths error if the `xyz.radicle.project` payload is not present
in the identity document. Change these to fall back gracefully.

Loading of payloads is unified in `GetPayload`.

An important detail is that `PayloadError::NotFound` is removed, and
`Option` is used instead.
2026-08-30 17:37:09 +02:00
Lorenz Leutgeb de43682f16 rust: 1.97.1 → 1.98.0
The changes to `**/args.rs` are due to better linting: Clippy found that
we may use `as_chunks`. Note that this function was stabilized in 1.88.0.
2026-08-30 14:28:36 +02:00
Lorenz Leutgeb 7f5de25223 Release 1.10.2
Update `CHANGELOG.md` for the release of version 1.10.2.
releases/1.10.2
2026-08-26 21:18:50 +02:00
Lorenz Leutgeb 3054779bfa windows: Set process creation flags
When executing programs on Windows, we suppress creating a new window,
and, if the process should continue to run in the background, we
explicitly create a new process group and detach.
2026-08-25 22:58:56 +02:00
Lorenz Leutgeb 9c06c4086a cli/patch: Spawn git for diffs directly
Spawning `rad diff` works, but prints a deprecation notice, because
`rad diff` itself is deprecated. `rad patch diff` however is not
deprecated and should just take a shortcut.
2026-08-25 20:39:29 +02:00
Lorenz Leutgeb 3da781f9e1 remote-helper: Accept option "pushcert if-asked"
This fixes issue 135835b572.
2026-08-23 23:09:38 +02:00
Lorenz Leutgeb 17ff650ec1 cli/node: Label Process ID
Resolve issue bb28940307 by clarifying
that the number printed is a process identifier.
2026-08-23 22:48:34 +02:00
Lorenz Leutgeb 96d74ea9ba radicle/cob/identity: Tighten initial revision
Make `Identity::new` private, to have more control over the initial
revision of the COB. Also assert that the author of the revision is the
solve delegate of the initial revision, i.e., the "founder".
2026-08-23 20:51:13 +02:00
Lorenz Leutgeb 675b82f344 radicle: Remove ReadRepository::identity_root_of
This function is unused.
2026-08-23 20:51:13 +02:00
Lorenz Leutgeb 388d985578 radicle/storage: Secure canonical_identity_head
Do not iterate over all user namespaces to find the ID of the identity
COB, but load from the founder's namespace specifically.

If the namespace of the founder is gone, attempt to recover by
walking back from `rad/id`.
2026-08-23 20:51:13 +02:00
Lorenz Leutgeb 26708e81a8 node/test: Demonstrate injection of Identity COB
This test shows how Bob is able to change visibility of Alice's repository from
private to public, even though Bob is not a delegate.
2026-08-23 20:49:09 +02:00
Lorenz Leutgeb 392542e923 build/build: Fix filename of Git archive
`build/upload` expects a filename that uses the *version*, i.e., a
semver triple, not the *revision*, i.e. a Git commit object identifier.
2026-08-23 19:33:37 +02:00
Lorenz Leutgeb d66f7e598b cli, crypto: Comment keys in SSH Agent
To avoid confusion how the key ended up in SSH Agent, add a comment that
adds some explanation.

See also
<https://radicle.zulipchat.com/#narrow/channel/392584-Feedback/topic/ssh-key.20with.20comment.20in.20agent/with/618208959>.
2026-08-23 19:28:32 +02:00
Lorenz Leutgeb 31f3d08d63 radicle/cob/thread: Use timeline: IndexSet
Plenty conservative `debug_assert!`s, cause panics as soon as two
actions that should be added to the timeline appear within the same
operation. But there is no code in place to prevent this.

It also does not seem to be problematic to visit the same operation
multiple times (once per contained action).

A set that retains iteration order does the job.

Analysis of this bug was done over Zulip, see
<https://radicle.zulipchat.com/#narrow/channel/369873-Support/topic/radicle-node.201.2E10.20segfaults/with/616991470>.

`Update::Reviewed::review` is boxed due to:

    error: large size difference between variants
       --> crates/radicle-cli/src/terminal/patch/timeline.rs:158:1
        |
    158 | /  enum Update<'a> {
    159 | |      /// A revision of the patch was reviewed.
    160 | |      Reviewed { review: Review },
        | |      --------------------------- the largest variant contains at least 352 bytes
    161 | |      /// A revision of the patch was merged.
    162 | |/     Merged {
    163 | ||         author: Author<'a>,
    164 | ||         /// If the merge is none, this means that it was a fast-forward merge.
    165 | ||         merge: Option<Merge>,
    166 | ||     },
        | ||_____- the second-largest variant contains at least 120 bytes
    167 | |  }
        | |__^ the entire enum is at least 352 bytes
2026-08-23 19:15:09 +02:00
Lorenz Leutgeb d7edbfb217 radicle/cob/thread: Make timeline private
There is no reason to have `pub(crate)` here.
2026-08-23 19:15:09 +02:00
Lorenz Leutgeb 5ddd5c64ea radicle/cob/thread: Make comments private
There is no strong reason to have `pub(crate)` here.
2026-08-23 19:15:09 +02:00
Lars Wirzenius a62b808773 ambient: Drop building of *.deb package in CI
The `*.deb` packaging has moved t radicle-apt-repo,
so there is no point in trying to build it in heartwood CI.
2026-08-23 18:27:01 +02:00
Lars Wirzenius d840fe006f ambient: Match rust-toolchain.toml
Update the rustup action in the pre-plan in `.radicle/ambient.yaml`
to use the same toolchain and components as `rust-toolchain.toml`
specifies. This allows `cargo` commands to work.
2026-08-23 18:26:30 +02:00
Lorenz Leutgeb 16de8f1950 README: Add references to downstream packages 2026-08-14 15:31:36 +02:00
Lorenz Leutgeb d7d9df27a5 debian: Remove
According to Lars Wirzenius, this is not required anymore, as it was
made redundant by `rad:z2nDKoCF4hg6xVrv7v93LmWHDJKUr`.

See also
<https://radicle.zulipchat.com/#narrow/channel/369277-heartwood/topic/Removal.20of.20.60debian.60.20directory/with/616115121>
2026-08-14 15:21:12 +02:00
David Sommerseth 2a9b5e72e9 cargo/spin: 0.9.8 → 0.9.9
Version 0.9.8 of `spin` was yanked. See also
<https://rustsec.org/advisories/RUSTSEC-2023-0031.html>.
and <https://github.com/zesterer/spin-rs/issues/148>.
2026-08-14 15:07:05 +02:00
Lorenz Leutgeb 71f39fb195 Release 1.10.1 releases/1.10.1 2026-08-12 16:55:28 +02:00
Lars WirzeniusandShawn Webb 52ac5d3b3e cli/debug: Add hardenedBsd detection
This is conditional on the target operating system being FreeBSDs.
HardenedBSD is FreeBSD but with changes. We determine which one it is,
by running 'sysctl --values hardening.version'.

Co-authored-by: Shawn Webb <shawn.webb@hardenedbsd.org>
2026-08-12 16:42:48 +02:00
Lars Wirzenius 9f05038234 cli/debug: Output /etc/os-release if available 2026-08-12 16:42:18 +02:00
Lorenz Leutgeb d18293c6ad cli/test: Do not accidentally test rad debug
The tests `rad-warn-ipv6.md` and `rad-warn-old-nodes.md` are meant to
primarily test the output of warnings. They test the output twice, via
`rad debug` and via `rad node status`.

Testing the output via one command should be sufficient.
2026-08-12 16:14:34 +02:00
Lorenz Leutgeb 4e3c274468 crypto, node: Randomly generate ephemeral keys 2026-08-12 15:28:40 +02:00
Lorenz LeutgebandKonstantinos Maninakis 4fff390c32 crypto: Use VerifyingKey::verify_strict
Refer to
<https://docs.rs/ed25519-dalek/2.2.0/ed25519_dalek/struct.VerifyingKey.html#method.verify_strict>.

Co-authored-by: Konstantinos Maninakis <maninak@protonmail.com>
2026-08-12 15:28:40 +02:00
Daniel NormanandLorenz Leutgeb d4acccf614 protocol/service: Check visibility on Subscribe
When `Service::handle_message` handles `Message::Subscribe`, constraints
regarding visibility of repositories are not considered, this leads to
leaking RIDs of private repositories.

Add a corresponding check.

Add a test to verify that reference announcements relayed via subscribe
correctly apply visibility filtering, there by ensuring references of
private repositories are only propagated to nodes on the allow list.

The test regarding deduplication needs a fix: Ensure that all mock
repositories are public and in storage so that they do not
get filtered out in case of unknown visiblity.

Co-authored-by: Lorenz Leutgeb <lorenz.leutgeb@radicle.dev>
2026-08-12 15:28:40 +02:00
Lorenz Leutgeb 6ba619f9a6 build/config: Link -dead_strip_dylibs on macOS 2026-08-06 17:31:04 +02:00