node: Rename systemd Credentials

Because we changed our main domain from radicle.xyz to radicle.dev, we
should also change our systemd credential identifiers.

Handling is move into a new function, which also checks the old names
for backwards compatibility.
This commit is contained in:
Lorenz Leutgeb 2026-04-27 18:10:52 +02:00
parent 06ff36ebc4
commit cb57e6560f
No known key found for this signature in database
2 changed files with 52 additions and 27 deletions

View File

@ -13,6 +13,7 @@ Following a domain move of the project, the names of the bootstrap nodes change:
`{iris,rosa}.radicle.{xyz → network}`. `{iris,rosa}.radicle.{xyz → network}`.
Old names in the Radicle configuration will be detected and cause warnings to Old names in the Radicle configuration will be detected and cause warnings to
be printed. be printed.
The systemd credential IDs that node uses change: `{xyz → dev}.radicle.node.*`.
## New Features ## New Features

View File

@ -213,6 +213,55 @@ enum ExecutionError {
}, },
} }
/// Loads a credential from systemd, if available.
///
/// The credential ID should only be given as a suffix, as this function will
/// try different prefixes for backwards compatibility reasons.
///
/// The prefix `dev.radicle.node` is the preferred prefix, and should be used
/// for new credentials, while the prefix `xyz.radicle.node` is deprecated and
/// should be migrated away from. If it is used, a warning is logged.
#[cfg(all(feature = "systemd", target_os = "linux"))]
fn load_credential(id_suffix: &str) -> Option<String> {
const INFIX_NODE: &str = ".radicle.node.";
const PREFIX_DEV: &str = "dev";
const PREFIX_XYZ: &str = "xyz";
let id_dev = format!("{}{}{}", PREFIX_DEV, INFIX_NODE, id_suffix);
let credential = match radicle_systemd::credential::path(&id_dev) {
Ok(option) => option,
Err(err) => {
log::warn!(target: "node", "Failed to obtain path of the passphrase file via systemd credential with '{id_dev}': {err}");
None
}
};
let credential = credential.or_else(|| {
let id_xyz = format!("{}{}{}", PREFIX_XYZ, INFIX_NODE, id_suffix);
match radicle_systemd::credential::path(&id_xyz) {
Ok(option) => {
log::warn!(target: "node", "Obtain path of the passphrase file via systemd credential with '{id_xyz}'. Using this credential ID is discouraged. Please change the ID to '{id_dev}'.");
option
},
Err(err) => {
log::warn!(target: "node", "Failed to obtain path of the passphrase file via systemd credential with '{id_xyz}': {err}");
None
}
}
});
credential.and_then(|ref path| {
match std::fs::read_to_string(path) {
Ok(passphrase) => Some(passphrase),
Err(err) => {
log::warn!(target: "node", "Failed to read passphrase from '{}': {err}", path.display());
None
}
}
})
}
fn execute(options: Options) -> Result<(), ExecutionError> { fn execute(options: Options) -> Result<(), ExecutionError> {
let home = profile::home()?; let home = profile::home()?;
@ -244,39 +293,14 @@ fn execute(options: Options) -> Result<(), ExecutionError> {
let passphrase = None; let passphrase = None;
#[cfg(all(feature = "systemd", target_os = "linux"))] #[cfg(all(feature = "systemd", target_os = "linux"))]
let passphrase = passphrase.or_else(|| { let passphrase = passphrase.or_else(|| load_credential("passphrase").map(|s| s.into()));
const ID: &str = "xyz.radicle.node.passphrase";
match radicle_systemd::credential::path(ID) {
Err(err) => {
log::warn!(target: "node", "Failed to obtain path of the passphrase file via systemd credential with '{ID}': {err}");
None
},
Ok(Some(ref path)) => match std::fs::read_to_string(path) {
Ok(passphrase) => Some(passphrase.into()),
Err(err) => {
log::warn!(target: "node", "Failed to read passphrase from '{}': {err}", path.display());
None
}
}
Ok(None) => None,
}
});
let passphrase = passphrase.or_else(profile::env::passphrase); let passphrase = passphrase.or_else(profile::env::passphrase);
let secret_path = options.secret; let secret_path = options.secret;
#[cfg(all(feature = "systemd", target_os = "linux"))] #[cfg(all(feature = "systemd", target_os = "linux"))]
let secret_path = secret_path.or_else(|| { let secret_path = secret_path.or_else(|| load_credential("secret").map(PathBuf::from));
const ID: &str = "xyz.radicle.node.secret";
match radicle_systemd::credential::path(ID) {
Err(err) => {
log::warn!(target: "node", "Failed to obtain path of the secret key via systemd credential with ID '{ID}': {err}");
None
},
Ok(path) => path
}
});
let secret_path = secret_path let secret_path = secret_path
.or_else(|| config.node.secret.clone()) .or_else(|| config.node.secret.clone())