45 lines
1.5 KiB
Rust
45 lines
1.5 KiB
Rust
use notesagent_host::credentials::CredentialBroker;
|
|
use std::path::PathBuf;
|
|
|
|
fn main() -> Result<(), String> {
|
|
let mut arguments = std::env::args_os().skip(1);
|
|
let vault = PathBuf::from(arguments.next().ok_or("TARGET_REQUIRED")?);
|
|
let legacy = PathBuf::from(arguments.next().ok_or("LEGACY_REQUIRED")?);
|
|
if arguments.next().is_some() {
|
|
return Err("ARGUMENTS_INVALID".into());
|
|
}
|
|
let parent = vault.parent().ok_or("TARGET_INVALID")?;
|
|
let backup = parent.join("stronghold.pre-0.5.0.onxcred");
|
|
let auto_key = parent.join("auto-unlock.dpapi");
|
|
if auto_key.exists() {
|
|
return Err("AUTO_UNLOCK_ALREADY_CONFIGURED".into());
|
|
}
|
|
if backup.exists() {
|
|
return Err("BACKUP_ALREADY_EXISTS".into());
|
|
}
|
|
if vault.exists() {
|
|
std::fs::rename(&vault, &backup).map_err(|_| "BACKUP_FAILED")?;
|
|
}
|
|
let migrated = (|| {
|
|
let mut broker = CredentialBroker::new(vault.clone());
|
|
if !broker.ensure_system_unlock()? {
|
|
return Err("AUTO_UNLOCK_INITIALIZATION_FAILED".into());
|
|
}
|
|
broker.import_fernet(&legacy, None)
|
|
})();
|
|
match migrated {
|
|
Ok(count) => {
|
|
println!("Migrated {count} credential(s) to Windows automatic unlock.");
|
|
Ok(())
|
|
}
|
|
Err(error) => {
|
|
let _ = std::fs::remove_file(&vault);
|
|
let _ = std::fs::remove_file(&auto_key);
|
|
if backup.exists() {
|
|
let _ = std::fs::rename(&backup, &vault);
|
|
}
|
|
Err(error)
|
|
}
|
|
}
|
|
}
|