hive-c0re: stop silently dropping errors on credential/marker writes
Add secret_file::write_secret_0600: create the parent dir, write a sibling temp file opened create_new + mode 0600, sync_all, rename over the target. Use it for the matrix sender token, the space/chat room-id files and the forge core token, which previously wrote at the process umask, then chmod-ed with the error discarded, and dropped the create_dir_all error. agent_identity::write_identity uses it too instead of its own open-0600 loop; that loop opened with create + truncate, so a pre-existing file kept its old mode. Also log instead of discarding: - the manager's applied-rev marker write in auto_update - the knowledge `git remote set-url` scrub (spawn error and non-zero exit; the exit status only, since stderr may echo the old URL) - the parent create_dir_all in paths::move_if_legacy Closes #5037
This commit is contained in:
parent
54226e027d
commit
f53ccb2740
8 changed files with 119 additions and 53 deletions
|
|
@ -194,14 +194,8 @@ fn sender_source<'a>(stored: Option<&'a str>, on_disk: Option<&str>) -> SenderSo
|
|||
/// directory if it is not there. The file's mode is the only thing keeping an
|
||||
/// unprivileged reader off the hive's matrix credential.
|
||||
fn persist_sender_token(path: &std::path::Path, access_token: &str) -> Result<()> {
|
||||
use std::os::unix::fs::PermissionsExt;
|
||||
|
||||
if let Some(parent) = path.parent() {
|
||||
std::fs::create_dir_all(parent).ok();
|
||||
}
|
||||
std::fs::write(path, format!("{access_token}\n"))
|
||||
crate::secret_file::write_secret_0600(path, format!("{access_token}\n").as_bytes())
|
||||
.with_context(|| format!("matrix: write the sender token to {}", path.display()))?;
|
||||
let _ = std::fs::set_permissions(path, std::fs::Permissions::from_mode(0o600));
|
||||
tracing::info!(path = %path.display(), "matrix: provisioned the sender token");
|
||||
Ok(())
|
||||
}
|
||||
|
|
@ -308,15 +302,9 @@ pub fn read_sender_token() -> Result<String> {
|
|||
|
||||
/// Persist the hive Space room id to [`hive_space_room_id_path()`] (0600).
|
||||
fn persist_space_room_id(room_id: &str) -> Result<()> {
|
||||
use std::os::unix::fs::PermissionsExt;
|
||||
let path = hive_space_room_id_path();
|
||||
if let Some(parent) = path.parent() {
|
||||
std::fs::create_dir_all(parent).ok();
|
||||
}
|
||||
std::fs::write(&path, format!("{room_id}\n"))
|
||||
.with_context(|| format!("matrix: write space room_id to {}", path.display()))?;
|
||||
let _ = std::fs::set_permissions(&path, std::fs::Permissions::from_mode(0o600));
|
||||
Ok(())
|
||||
crate::secret_file::write_secret_0600(&path, format!("{room_id}\n").as_bytes())
|
||||
.with_context(|| format!("matrix: write space room_id to {}", path.display()))
|
||||
}
|
||||
|
||||
/// Scan the admin account's joined rooms for the canonical hive Space: the
|
||||
|
|
@ -449,15 +437,9 @@ pub async fn ensure_hive_space(client: &reqwest::Client, sender_token: &str) ->
|
|||
|
||||
/// Persist the hive chat room id to [`hive_chat_room_id_path()`] (0600).
|
||||
fn persist_chat_room_id(room_id: &str) -> Result<()> {
|
||||
use std::os::unix::fs::PermissionsExt;
|
||||
let path = hive_chat_room_id_path();
|
||||
if let Some(parent) = path.parent() {
|
||||
std::fs::create_dir_all(parent).ok();
|
||||
}
|
||||
std::fs::write(&path, format!("{room_id}\n"))
|
||||
.with_context(|| format!("matrix: write chat room_id to {}", path.display()))?;
|
||||
let _ = std::fs::set_permissions(&path, std::fs::Permissions::from_mode(0o600));
|
||||
Ok(())
|
||||
crate::secret_file::write_secret_0600(&path, format!("{room_id}\n").as_bytes())
|
||||
.with_context(|| format!("matrix: write chat room_id to {}", path.display()))
|
||||
}
|
||||
|
||||
/// Scan the admin account's joined rooms for the canonical hive chat room:
|
||||
|
|
|
|||
Loading…
Reference in a new issue