#![allow(non_snake_case, non_camel_case_types, non_upper_case_globals)]
use crate::ported::errors;
use crate::ported::helpers;
use crate::ported::request::common::normalizePasswordStorePath;
use crate::ported::request::process::request;
use crate::ported::response;
use std::fs;
pub fn deleteFile(request: &request) {
let responseData = response::MakeDeleteResponse();
if !request.File.ends_with(".gpg") { eprintln!(
"The requested password file '{}' does not have the expected '.gpg' extension",
request.File
);
response::SendErrorAndExit( errors::Code::InvalidPasswordFileExtension,
Some(response::params_of(&[
(errors::field::MESSAGE, "The requested password file does not have the expected '.gpg' extension"),
(errors::field::ACTION, "delete"),
(errors::field::FILE, &request.File),
])),
);
}
let store = match request.Settings.Stores.get(&request.StoreID) { Some(s) => s.clone(),
None => { eprintln!(
"The password store with ID '{}' is not present in the list of stores '{:?}'",
request.StoreID, request.Settings.Stores
);
response::SendErrorAndExit( errors::Code::InvalidPasswordStore,
Some(response::params_of(&[
(errors::field::MESSAGE, "The password store is not present in the list of stores"),
(errors::field::ACTION, "delete"),
(errors::field::STORE_ID, &request.StoreID),
])),
);
}
};
let normalizedStorePath = match normalizePasswordStorePath(&store.Path) { Ok(p) => p,
Err(e) => { eprintln!(
"The password store '{:?}' is not accessible at its location: {}",
store, e
);
response::SendErrorAndExit( errors::Code::InaccessiblePasswordStore,
Some(response::params_of(&[
(errors::field::MESSAGE, "The password store is not accessible"),
(errors::field::ACTION, "delete"),
(errors::field::ERROR, &e),
(errors::field::STORE_ID, &store.ID),
(errors::field::STORE_NAME, &store.Name),
(errors::field::STORE_PATH, &store.Path),
])),
);
}
};
let mut store = store;
store.Path = normalizedStorePath.to_string_lossy().into_owned();
let filePath = normalizedStorePath.join(&request.File);
if let Err(e) = fs::remove_file(&filePath) { eprintln!("Unable to delete the password file: {e}"); response::SendErrorAndExit( errors::Code::UnableToDeletePasswordFile,
Some(response::params_of(&[
(errors::field::MESSAGE, "Unable to delete the password file"),
(errors::field::ACTION, "delete"),
(errors::field::ERROR, &e.to_string()),
(errors::field::FILE, &request.File),
(errors::field::STORE_ID, &store.ID),
(errors::field::STORE_NAME, &store.Name),
(errors::field::STORE_PATH, &store.Path),
])),
);
}
let mut parentDir = filePath.parent().map(|p| p.to_path_buf()); loop { let dir = match parentDir.clone() {
Some(d) => d,
None => break,
};
if dir == normalizedStorePath { break; }
let isEmpty = match helpers::IsDirectoryEmpty(&dir) { Ok(b) => b,
Err(e) => { eprintln!("Unable to determine if directory is empty and can be deleted: {e}"); response::SendErrorAndExit( errors::Code::UnableToDetermineIsDirectoryEmpty,
Some(response::params_of(&[
(errors::field::MESSAGE, "Unable to determine if directory is empty and can be deleted"),
(errors::field::ACTION, "delete"),
(errors::field::ERROR, &e.to_string()),
(errors::field::DIRECTORY, &dir.to_string_lossy()),
(errors::field::STORE_ID, &store.ID),
(errors::field::STORE_NAME, &store.Name),
(errors::field::STORE_PATH, &store.Path),
])),
);
}
};
if !isEmpty { break; }
if let Err(e) = fs::remove_dir(&dir) { eprintln!("Unable to delete the empty directory: {e}"); response::SendErrorAndExit( errors::Code::UnableToDeleteEmptyDirectory,
Some(response::params_of(&[
(errors::field::MESSAGE, "Unable to delete the empty directory"),
(errors::field::ACTION, "delete"),
(errors::field::ERROR, &e.to_string()),
(errors::field::DIRECTORY, &dir.to_string_lossy()),
(errors::field::STORE_ID, &store.ID),
(errors::field::STORE_NAME, &store.Name),
(errors::field::STORE_PATH, &store.Path),
])),
);
}
parentDir = dir.parent().map(|p| p.to_path_buf()); }
response::SendOk(responseData); }
#[allow(non_snake_case)]
const _: () = ();