chiark / gitweb /
ssh keys update: Allow setting up if static is hardlinked to real
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 7 Jun 2021 13:41:31 +0000 (14:41 +0100)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Mon, 7 Jun 2021 13:41:31 +0000 (14:41 +0100)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
src/prelude.rs
src/sshkeys.rs

index 4d49923c95ed7bf650abbfc9c9d3437a05c8e78a..138447b19b79cd28d7639ab1301325ee95052199 100644 (file)
@@ -33,10 +33,10 @@ pub use std::iter;
 pub use std::iter::repeat_with;
 pub use std::marker::PhantomData;
 pub use std::num::{NonZeroUsize, TryFromIntError, Wrapping};
-pub use std::os::linux::fs::MetadataExt; // todo why linux for st_mode??
+pub use std::os::linux::fs::MetadataExt as _; // todo why linux for st_mode??
 pub use std::os::unix;
 pub use std::os::unix::ffi::OsStrExt;
-pub use std::os::unix::fs::OpenOptionsExt;
+pub use std::os::unix::fs::{MetadataExt, OpenOptionsExt};
 pub use std::os::unix::io::{AsRawFd, IntoRawFd, RawFd};
 pub use std::os::unix::net::UnixStream;
 pub use std::os::unix::process::{CommandExt, ExitStatusExt};
index 8044b3b0301db0a2b4f240420f2a12cd3b379ea2..6f9d6373b44906dc8c76ebe09eb05450fe36598c 100644 (file)
@@ -481,17 +481,24 @@ impl Global {
     };
 
     (||{
-      let f = match File::open(path) {
+      let mut f = match File::open(path) {
         Err(e) if e.kind() == ErrorKind::NotFound => return Ok(()),
         x => x,
       }.context("open")?;
 
-      let l = BufReader::new(f).lines().next()
+      let l = BufReader::new(&mut f).lines().next()
         .ok_or_else(|| anyhow!("no first line!"))?
         .context("read first line")?;
       if l == MAGIC_BANNER {
         return Ok(());
       }
+      if let Some(staticf) = &staticf {
+        let devino = |f: &File| f.metadata().map(|m| (m.dev(), m.ino()));
+        if devino(staticf).context("fstat static auth keys")? ==
+           devino(&f).context("fstat existing auth keys")? {
+             return Ok(());
+           }
+      }
       Err(anyhow!(
           "first line is not as expected (manually written/edited?)"
       ))