validate preferred key on the backend

This commit is contained in:
Nikita Galaiko 2024-01-15 08:19:54 +01:00 committed by GitButler
parent 74c495bc2a
commit cc17805694
2 changed files with 24 additions and 0 deletions

View File

@ -13,6 +13,12 @@ use super::controller::{self, Controller};
impl From<controller::UpdateError> for Error {
fn from(value: controller::UpdateError) -> Self {
match value {
controller::UpdateError::Validation(
controller::UpdateValidationError::KeyNotFound(path)
) => Error::UserError {
code: Code::Projects,
message: format!("key '{}' not found", path.display()),
},
controller::UpdateError::NotFound => Error::UserError {
code: Code::Projects,
message: "Project not found".into(),

View File

@ -92,6 +92,16 @@ impl Controller {
}
pub async fn update(&self, project: &UpdateRequest) -> Result<Project, UpdateError> {
if let Some(super::AuthKey::Local { private_key_path, .. }) = &project.preferred_key {
use resolve_path::PathResolveExt;
let private_key_path = private_key_path.resolve();
if !private_key_path.exists() {
return Err(UpdateError::Validation(
UpdateValidationError::KeyNotFound(private_key_path.to_path_buf()),
));
}
}
let updated = self
.projects_storage
.update(project)
@ -203,9 +213,17 @@ pub enum UpdateError {
#[error("project not found")]
NotFound,
#[error(transparent)]
Validation(UpdateValidationError),
#[error(transparent)]
Other(#[from] anyhow::Error),
}
#[derive(Debug, thiserror::Error)]
pub enum UpdateValidationError {
#[error("{0} not found")]
KeyNotFound(path::PathBuf),
}
#[derive(Debug, thiserror::Error)]
pub enum AddError {
#[error("not a directory")]