Add Linux keyring storage boundary

This commit is contained in:
2026-10-25 05:43:45 +01:00
parent d7dad3021f
commit 761ff5305d
428 changed files with 1170 additions and 3 deletions
+5
View File
@@ -18,3 +18,8 @@ jobs:
- run: npm run format:check
- run: npm run check
- run: npm run build
- uses: actions-rust-lang/setup-rust-toolchain@v1
- working-directory: native
run: cargo fmt -- --check
- working-directory: native
run: cargo test
+4 -3
View File
@@ -4,9 +4,10 @@ This directory is the home of the standalone Linux client repository.
The current development shell connects to the server readiness endpoint and
provides an administrator login gate. The browser/dev client keeps its bearer
session in memory only; the native AppImage integration must replace that
temporary behavior with the Linux kernel keyring before persistent client
authentication is considered complete.
session in memory only. The `native/` crate defines the AppImage storage
boundary: `settings.json` contains only the server address and username, while
the session credential is stored in the Linux kernel keyring with no plaintext
fallback.
The client is a Svelte-based control surface distributed as an x86-64 AppImage. It communicates with `trixie-server` through the documented versioned HTTP and authenticated WebSocket interfaces.
+284
View File
@@ -0,0 +1,284 @@
# This file is automatically @generated by Cargo.
# It is not intended for manual editing.
version = 4
[[package]]
name = "bitflags"
version = "2.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06"
[[package]]
name = "block-buffer"
version = "0.10.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71"
dependencies = [
"generic-array",
]
[[package]]
name = "cfg-if"
version = "1.0.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600"
[[package]]
name = "cpufeatures"
version = "0.2.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280"
dependencies = [
"libc",
]
[[package]]
name = "crypto-common"
version = "0.1.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
dependencies = [
"generic-array",
"typenum",
]
[[package]]
name = "digest"
version = "0.10.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [
"block-buffer",
"crypto-common",
]
[[package]]
name = "errno"
version = "0.3.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb"
dependencies = [
"libc",
"windows-sys",
]
[[package]]
name = "fastrand"
version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223"
[[package]]
name = "generic-array"
version = "0.14.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
dependencies = [
"typenum",
"version_check",
]
[[package]]
name = "getrandom"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099"
dependencies = [
"cfg-if",
"libc",
"r-efi",
]
[[package]]
name = "itoa"
version = "1.0.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682"
[[package]]
name = "libc"
version = "0.2.191"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "65cd87c9a6d60536580b316ad985726104730a5151c99845f2490428ef91240a"
[[package]]
name = "linux-raw-sys"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53"
[[package]]
name = "memchr"
version = "2.8.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98"
[[package]]
name = "once_cell"
version = "1.21.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50"
[[package]]
name = "proc-macro2"
version = "1.0.107"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
version = "1.0.47"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001"
dependencies = [
"proc-macro2",
]
[[package]]
name = "r-efi"
version = "6.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf"
[[package]]
name = "rustix"
version = "1.1.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d"
dependencies = [
"bitflags",
"errno",
"libc",
"linux-raw-sys",
"windows-sys",
]
[[package]]
name = "serde"
version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba"
dependencies = [
"serde_core",
"serde_derive",
]
[[package]]
name = "serde_core"
version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.229"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
[[package]]
name = "serde_json"
version = "1.0.154"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7e9cc8b1b85264074fbcc02a88680c4096b1e47df8f739dceb03bf482f04bd6"
dependencies = [
"itoa",
"memchr",
"serde",
"serde_core",
"zmij",
]
[[package]]
name = "sha2"
version = "0.10.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
dependencies = [
"cfg-if",
"cpufeatures",
"digest",
]
[[package]]
name = "syn"
version = "3.0.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d78c8dee4c7bf0e14673097256fed6142ce9d3b85a408189d07482442145823b"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "tempfile"
version = "3.27.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd"
dependencies = [
"fastrand",
"getrandom",
"once_cell",
"rustix",
"windows-sys",
]
[[package]]
name = "trixy-native"
version = "0.1.0"
dependencies = [
"serde",
"serde_json",
"sha2",
"tempfile",
]
[[package]]
name = "typenum"
version = "1.20.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20"
[[package]]
name = "unicode-ident"
version = "1.0.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a2c754d6c33795a1c324727428e5a7dedb5b06195f9890bdbcba760d3e246563"
[[package]]
name = "version_check"
version = "0.9.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "windows-link"
version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5"
[[package]]
name = "windows-sys"
version = "0.61.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc"
dependencies = [
"windows-link",
]
[[package]]
name = "zmij"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b"
+14
View File
@@ -0,0 +1,14 @@
[package]
name = "trixy-native"
version = "0.1.0"
edition = "2021"
license = "MIT"
description = "Native Linux storage boundary for the Trixie client"
[dependencies]
serde = { version = "1", features = ["derive"] }
serde_json = "1"
sha2 = "0.10"
[dev-dependencies]
tempfile = "3"
+12
View File
@@ -0,0 +1,12 @@
# Native credential boundary
This crate is the storage boundary used by the future Linux AppImage shell.
`Settings` writes only `server_address` and `username` to the client
`settings.json`. Session credentials are stored under the Linux kernel
keyring service `trixie.server.session`, scoped by server address and
username. `load_session` returns `None` when the keyring is unavailable;
callers must return to credential entry and must not create a plaintext
fallback.
The crate uses `keyctl` with argument arrays, never a shell command. It does
not log or serialize session values.
+146
View File
@@ -0,0 +1,146 @@
//! Native persistence boundary for the Linux client.
//!
//! Settings are deliberately limited to non-secret connection metadata. The
//! session credential is stored as a `user` key in the Linux kernel keyring
//! through the `keyctl` utility. If keyring access fails, callers receive an
//! error and must ask for credentials again; no plaintext fallback is allowed.
use serde::{Deserialize, Serialize};
use sha2::{Digest, Sha256};
use std::{
fs, io,
path::{Path, PathBuf},
process::Command,
};
pub const KEYRING_SERVICE: &str = "trixie.server.session";
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Settings {
pub server_address: String,
pub username: String,
}
impl Settings {
pub fn load(path: impl AsRef<Path>) -> io::Result<Self> {
let bytes = fs::read(path)?;
serde_json::from_slice(&bytes)
.map_err(|error| io::Error::new(io::ErrorKind::InvalidData, error))
}
pub fn save(&self, path: impl AsRef<Path>) -> io::Result<()> {
let path = path.as_ref();
if let Some(parent) = path.parent() {
fs::create_dir_all(parent)?;
}
let bytes = serde_json::to_vec_pretty(self)
.map_err(|error| io::Error::new(io::ErrorKind::InvalidData, error))?;
let temporary = path.with_extension("json.tmp");
fs::write(&temporary, bytes)?;
fs::rename(temporary, path)
}
}
pub fn default_settings_path() -> PathBuf {
let base = std::env::var_os("XDG_CONFIG_HOME")
.map(PathBuf::from)
.or_else(|| std::env::var_os("HOME").map(|home| PathBuf::from(home).join(".config")))
.unwrap_or_else(|| PathBuf::from("."));
base.join("trixie").join("settings.json")
}
fn key_description(settings: &Settings) -> String {
let mut digest = Sha256::new();
digest.update(settings.server_address.as_bytes());
digest.update([0]);
digest.update(settings.username.as_bytes());
let digest = digest.finalize();
format!("{KEYRING_SERVICE}:{}", hex_encode(&digest))
}
fn hex_encode(bytes: &[u8]) -> String {
const HEX: &[u8; 16] = b"0123456789abcdef";
let mut result = String::with_capacity(bytes.len() * 2);
for byte in bytes {
result.push(HEX[(byte >> 4) as usize] as char);
result.push(HEX[(byte & 0x0f) as usize] as char);
}
result
}
fn keyctl(args: &[&str]) -> io::Result<Vec<u8>> {
let output = Command::new("keyctl").args(args).output()?;
if !output.status.success() {
return Err(io::Error::new(
io::ErrorKind::PermissionDenied,
"Linux kernel keyring access failed",
));
}
Ok(output.stdout)
}
pub fn store_session(settings: &Settings, session: &str) -> io::Result<()> {
if session.is_empty() {
return Err(io::Error::new(io::ErrorKind::InvalidInput, "empty session"));
}
let description = key_description(settings);
keyctl(&["add", "user", &description, session, "@s"]).map(|_| ())
}
pub fn load_session(settings: &Settings) -> io::Result<Option<String>> {
let description = key_description(settings);
let id = match keyctl(&["search", "@s", "user", &description]) {
Ok(value) => String::from_utf8_lossy(&value).trim().to_string(),
Err(_) => return Ok(None),
};
if id.is_empty() {
return Ok(None);
}
let value = keyctl(&["pipe", &id])?;
String::from_utf8(value)
.map(Some)
.map_err(|error| io::Error::new(io::ErrorKind::InvalidData, error))
}
pub fn clear_session(settings: &Settings) -> io::Result<()> {
let description = key_description(settings);
let id = String::from_utf8_lossy(&keyctl(&["search", "@s", "user", &description])?)
.trim()
.to_string();
if id.is_empty() {
return Ok(());
}
keyctl(&["unlink", &id, "@s"]).map(|_| ())
}
#[cfg(test)]
mod tests {
use super::*;
fn settings() -> Settings {
Settings {
server_address: "https://trixie.example".into(),
username: "admin".into(),
}
}
#[test]
fn settings_round_trip_contains_no_password_field() {
let directory = tempfile::tempdir().expect("temporary directory");
let path = directory.path().join("settings.json");
settings().save(&path).expect("save settings");
let text = fs::read_to_string(&path).expect("read settings");
assert!(!text.contains("password"));
assert_eq!(Settings::load(path).expect("load settings"), settings());
}
#[test]
fn key_description_is_stable_but_scoped_to_connection_and_user() {
let first = key_description(&settings());
assert_eq!(first, key_description(&settings()));
let mut different = settings();
different.username = "moderator".into();
assert_ne!(first, key_description(&different));
assert!(first.starts_with(KEYRING_SERVICE));
}
}
+1
View File
@@ -0,0 +1 @@
{"rustc_fingerprint":1210007815774095306,"outputs":{"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/reaper/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_has_atomic_primitive_alignment=\"16\"\ntarget_has_atomic_primitive_alignment=\"32\"\ntarget_has_atomic_primitive_alignment=\"64\"\ntarget_has_atomic_primitive_alignment=\"8\"\ntarget_has_atomic_primitive_alignment=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"15429304387725512996":{"success":true,"status":"","code":0,"stdout":"rustc 1.99.0 (b940084d7 2026-09-28)\nbinary: rustc\ncommit-hash: b940084d7eb6a299eb4bfeb8e34901bc051e7ac4\ncommit-date: 2026-09-28\nhost: x86_64-unknown-linux-gnu\nrelease: 1.99.0\nLLVM version: 23.1.1\n","stderr":""}},"successes":{}}
+3
View File
@@ -0,0 +1,3 @@
Signature: 8a477f597d28d172789f06886806bc55
# This file is a cache directory tag created by cargo.
# For information about cache directory tags see https://bford.info/cachedir/
View File
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
db8a3897bf88e90e
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[\"std\"]","declared_features":"[\"arbitrary\", \"bytemuck\", \"example_generated\", \"serde\", \"serde_core\", \"std\"]","target":7691312148208718491,"profile":11926785003450549200,"path":5443464120213635024,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/bitflags-3a99da603c7fdadf/dep-lib-bitflags","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
ece9249134a10c9b
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[]","declared_features":"[]","target":4098124618827574291,"profile":11926785003450549200,"path":5465649014904815144,"deps":[[10520923840501062997,"generic_array",false,16493912397480899531]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/block-buffer-a49e7b74df05ed56/dep-lib-block_buffer","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
51618e1016478289
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[]","declared_features":"[\"core\", \"rustc-dep-of-std\"]","target":13840298032947503755,"profile":11926785003450549200,"path":11058792650154348649,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cfg-if-1e9c5a118a245144/dep-lib-cfg_if","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
5dcedd5e9d0ad442
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[]","declared_features":"[]","target":2330704043955282025,"profile":11926785003450549200,"path":1896198174504173641,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cpufeatures-c66ff8dcdd82082d/dep-lib-cpufeatures","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
6d374d5a26a84bb7
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[\"std\"]","declared_features":"[\"getrandom\", \"rand_core\", \"std\"]","target":12082577455412410174,"profile":11926785003450549200,"path":3582492621506403237,"deps":[[6918147871599447195,"typenum",false,9002095519579012623],[10520923840501062997,"generic_array",false,16493912397480899531]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/crypto-common-1294f8b1d82dd2b1/dep-lib-crypto_common","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
a468b2bd6ae8db47
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[\"alloc\", \"block-buffer\", \"core-api\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"blobby\", \"block-buffer\", \"const-oid\", \"core-api\", \"default\", \"dev\", \"mac\", \"oid\", \"rand_core\", \"std\", \"subtle\"]","target":7510122432137863311,"profile":11926785003450549200,"path":7436233737715114717,"deps":[[6039282458970808711,"crypto_common",false,13207835214871345005],[10626340395483396037,"block_buffer",false,11172482022744844780]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/digest-0a771f46afd19aae/dep-lib-digest","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
42f52b8560b1f4f5
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[\"alloc\", \"default\", \"std\"]","declared_features":"[\"alloc\", \"default\", \"getrandom\", \"js\", \"std\"]","target":9543367341069791401,"profile":11926785003450549200,"path":17421528255653485375,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/fastrand-c3dd370172903a25/dep-lib-fastrand","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[10520923840501062997,"build_script_build",false,10090097976054138307]],"local":[{"Precalculated":"0.14.7"}],"rustflags":[],"config":0,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
cbb342e0ef25e6e4
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[\"more_lengths\"]","declared_features":"[\"more_lengths\", \"serde\", \"zeroize\"]","target":13084005262763373425,"profile":11926785003450549200,"path":4332620598671424490,"deps":[[6918147871599447195,"typenum",false,9002095519579012623],[10520923840501062997,"build_script_build",false,17990907784040197419]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/generic-array-d6b2188deed735b3/dep-lib-generic_array","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[\"more_lengths\"]","declared_features":"[\"more_lengths\", \"serde\", \"zeroize\"]","target":12318548087768197662,"profile":11528375766455597691,"path":11282514436624024422,"deps":[[5398981501050481332,"version_check",false,9141506819046141128]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/generic-array-e1c281c23bd1f564/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
a9311b454b237ddf
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[]","declared_features":"[\"std\", \"sys_rng\", \"wasm_js\"]","target":5479159445871601843,"profile":15892100710820588111,"path":1280497377378559200,"deps":[[15482175856213997617,"cfg_if",false,9908560290261131601],[17989731678791879549,"build_script_build",false,15934124068954184352],[18070707816531966863,"libc",false,6441745632629918148]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/getrandom-00989355ab645f57/dep-lib-getrandom","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[]","declared_features":"[\"std\", \"sys_rng\", \"wasm_js\"]","target":2835126046236718539,"profile":3667494010424785699,"path":9430382405154673595,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/getrandom-55483aa63909d659/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[17989731678791879549,"build_script_build",false,12220202757406454499]],"local":[{"RerunIfChanged":{"output":"debug/build/getrandom-5ac76cfe40e3f577/output","paths":["build.rs"]}}],"rustflags":[],"config":0,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
b979701db92ef271
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[]","declared_features":"[\"no-panic\"]","target":18426369533666673425,"profile":11926785003450549200,"path":13704350446160961929,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/itoa-5b56393bc94cfad5/dep-lib-itoa","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
c48954e685ad6559
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[]","declared_features":"[\"align\", \"const-extern-fn\", \"default\", \"extra_traits\", \"rustc-dep-of-std\", \"rustc-std-workspace-core\", \"std\", \"use_std\"]","target":17682796336736096309,"profile":4257197734456832517,"path":6326217517659532402,"deps":[[18070707816531966863,"build_script_build",false,6444638157452121161]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/libc-46f5cd6a37ccddc8/dep-lib-libc","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[18070707816531966863,"build_script_build",false,13897737912217593662]],"local":[{"RerunIfChanged":{"output":"debug/build/libc-92b3d665bd4b3463/output","paths":["build.rs"]}},{"RerunIfEnvChanged":{"var":"LIBC_BUILD_VERBOSE","val":null}},{"RerunIfEnvChanged":{"var":"RUST_LIBC_UNSTABLE_FREEBSD_VERSION","val":null}}],"rustflags":[],"config":0,"compile_kind":0}
@@ -0,0 +1 @@
3e67356fffaedec0
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[]","declared_features":"[\"align\", \"const-extern-fn\", \"default\", \"extra_traits\", \"rustc-dep-of-std\", \"rustc-std-workspace-core\", \"std\", \"use_std\"]","target":5408242616063297496,"profile":15490715990627648744,"path":18309442658069074778,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/libc-f61333b787d0680a/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
d67e0d33af5963f6
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[\"auxvec\", \"elf\", \"errno\", \"general\", \"ioctl\", \"no_std\"]","declared_features":"[\"auxvec\", \"bootparam\", \"btrfs\", \"core\", \"default\", \"elf\", \"elf_uapi\", \"errno\", \"general\", \"if_arp\", \"if_ether\", \"if_packet\", \"if_tun\", \"image\", \"io_uring\", \"ioctl\", \"landlock\", \"loop_device\", \"mempolicy\", \"net\", \"netlink\", \"no_std\", \"prctl\", \"ptrace\", \"rustc-dep-of-std\", \"std\", \"system\", \"vm_sockets\", \"xdp\"]","target":5772965225213482929,"profile":16926302248770857990,"path":9133322017746189832,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/linux-raw-sys-6909a3bb65c2afb1/dep-lib-linux_raw_sys","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
df0205a005ee3914
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[\"alloc\", \"std\"]","declared_features":"[\"alloc\", \"core\", \"default\", \"libc\", \"logging\", \"rustc-dep-of-std\", \"std\", \"use_std\"]","target":11745930252914242013,"profile":11926785003450549200,"path":17024294999599420469,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/memchr-e16633741164b756/dep-lib-memchr","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
fe851b4f825a6448
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[\"alloc\", \"race\", \"std\"]","declared_features":"[\"alloc\", \"atomic-polyfill\", \"critical-section\", \"default\", \"parking_lot\", \"portable-atomic\", \"race\", \"std\", \"unstable\"]","target":17524666916136250164,"profile":11926785003450549200,"path":3218264518077823566,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/once_cell-e0cacd25ac9ca48d/dep-lib-once_cell","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"","declared_features":"","target":0,"profile":0,"path":0,"deps":[[16346726298725429545,"build_script_build",false,9105682103552064299]],"local":[{"RerunIfChanged":{"output":"debug/build/proc-macro2-43d6a45c41cd7ac9/output","paths":["src/probe/proc_macro_span.rs","src/probe/proc_macro_span_location.rs","src/probe/proc_macro_span_file.rs"]}},{"RerunIfEnvChanged":{"var":"RUSTC_BOOTSTRAP","val":null}}],"rustflags":[],"config":0,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
7f366e182c5e65dd
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[\"proc-macro\"]","declared_features":"[\"default\", \"nightly\", \"proc-macro\", \"span-locations\"]","target":369203346396300798,"profile":11528375766455597691,"path":17009680396049250132,"deps":[[16346726298725429545,"build_script_build",false,8894751925946321119],[17795627090660149937,"unicode_ident",false,16862586366045555258]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/proc-macro2-5eedf25ae708e3eb/dep-lib-proc_macro2","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[\"proc-macro\"]","declared_features":"[\"default\", \"nightly\", \"proc-macro\", \"span-locations\"]","target":5408242616063297496,"profile":11528375766455597691,"path":9266844504976584239,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/proc-macro2-a8d356aba312f19c/dep-build-script-build-script-build","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
This file has an mtime of when this was started.
@@ -0,0 +1 @@
7eed0d36dddc0c38
@@ -0,0 +1 @@
{"rustc":5244445300240561903,"features":"[\"proc-macro\"]","declared_features":"[\"default\", \"proc-macro\"]","target":8313845041260779044,"profile":11528375766455597691,"path":18292718420730603895,"deps":[[8949245912927223590,"build_script_build",false,734989395155135820],[16346726298725429545,"proc_macro2",false,15953260798511298175]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/quote-2f2e43da6b031e20/dep-lib-quote","checksum":false}}],"rustflags":[],"config":9396254390672932401,"compile_kind":0}

Some files were not shown because too many files have changed in this diff Show More