Integrate host escalation with production sessions
This commit is contained in:
parent
254bb37764
commit
696dae610a
1 changed files with 1175 additions and 96 deletions
|
|
@ -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");
|
||||
|
|
|
|||
Loading…
Reference in a new issue