Integrate host escalation with production sessions

This commit is contained in:
ms2k 2026-07-18 04:03:39 +09:00
commit 696dae610a

View file

@ -95,6 +95,27 @@ impl RegularFileMailbox {
&self,
name: &std::ffi::OsStr,
bytes: &[u8],
) -> io::Result<MailboxEntryIdentity> {
self.publish_with_flags(name, bytes, RenameFlags::NOREPLACE)
}
/// Publishes one complete signed sender-owned record using an atomic rename.
///
/// # Errors
/// Refuses invalid names or incomplete durable publication.
pub fn publish_replacing(
&self,
name: &std::ffi::OsStr,
bytes: &[u8],
) -> io::Result<MailboxEntryIdentity> {
self.publish_with_flags(name, bytes, RenameFlags::empty())
}
fn publish_with_flags(
&self,
name: &std::ffi::OsStr,
bytes: &[u8],
flags: RenameFlags,
) -> io::Result<MailboxEntryIdentity> {
validate_mailbox_name(name)?;
let temporary_name = loop {
@ -131,7 +152,7 @@ impl RegularFileMailbox {
&temporary_name,
self.directory.as_fd(),
name,
RenameFlags::NOREPLACE,
flags,
)?;
self.directory.sync_all()?;
Ok(MailboxEntryIdentity {
@ -566,6 +587,24 @@ mod tests {
std::fs::remove_dir_all(directory).unwrap();
}
#[test]
fn sender_owned_mailbox_publication_atomically_replaces_stale_entry() {
let directory = test_directory("mailbox-sender-replace");
let mailbox = RegularFileMailbox::open(&directory).unwrap();
let name = std::ffi::OsStr::new("request.ready");
std::fs::write(directory.join(name), b"stale").unwrap();
mailbox.publish_replacing(name, b"signed").unwrap();
assert_eq!(std::fs::read(directory.join(name)).unwrap(), b"signed");
assert!(
mailbox
.names()
.unwrap()
.iter()
.all(|entry| !entry.as_encoded_bytes().ends_with(b".tmp"))
);
std::fs::remove_dir_all(directory).unwrap();
}
#[test]
fn mailbox_refuses_links_nonregular_and_oversize_records() {
let directory = test_directory("mailbox-hostile");