make sure we NEVER ever write the cli defined webhook to the database or dumps

This commit is contained in:
Tamo
2025-08-05 18:55:32 +02:00
parent 1ff6da63e8
commit 899be9c3ff
9 changed files with 130 additions and 63 deletions

View File

@ -493,7 +493,7 @@ fn import_dump(
// 2. Import the webhooks
if let Some(webhooks) = dump_reader.webhooks() {
index_scheduler.put_webhooks(webhooks.clone())?;
index_scheduler.update_runtime_webhooks(webhooks.webhooks.clone())?;
}
// 3. Import the `Key`s.

View File

@ -146,7 +146,7 @@ pub(super) struct WebhookResults {
async fn get_webhooks(
index_scheduler: GuardedData<ActionPolicy<{ actions::WEBHOOKS_GET }>, Data<IndexScheduler>>,
) -> Result<HttpResponse, ResponseError> {
let webhooks = index_scheduler.webhooks();
let webhooks = index_scheduler.webhooks_view();
let results = webhooks
.webhooks
.into_iter()
@ -326,7 +326,7 @@ async fn get_webhook(
uuid: Path<String>,
) -> Result<HttpResponse, ResponseError> {
let uuid = Uuid::from_str(&uuid.into_inner()).map_err(InvalidUuid)?;
let mut webhooks = index_scheduler.webhooks();
let mut webhooks = index_scheduler.webhooks_view();
let webhook = webhooks.webhooks.remove(&uuid).ok_or(WebhookNotFound(uuid))?;
let webhook = WebhookWithMetadata::from(uuid, webhook);
@ -368,8 +368,8 @@ async fn post_webhook(
return Err(TooManyHeaders(uuid).into());
}
let mut webhooks = index_scheduler.webhooks();
if webhooks.webhooks.len() >= 20 {
let mut webhooks = index_scheduler.retrieve_runtime_webhooks();
if webhooks.len() >= 20 {
return Err(TooManyWebhooks.into());
}
@ -383,8 +383,8 @@ async fn post_webhook(
};
check_changed(uuid, &webhook)?;
webhooks.webhooks.insert(uuid, webhook.clone());
index_scheduler.put_webhooks(webhooks)?;
webhooks.insert(uuid, webhook.clone());
index_scheduler.update_runtime_webhooks(webhooks)?;
analytics.publish(PatchWebhooksAnalytics::post_webhook(), &req);
@ -426,13 +426,17 @@ async fn patch_webhook(
let webhook_settings = webhook_settings.into_inner();
debug!(parameters = ?(uuid, &webhook_settings), "Patch webhook");
let mut webhooks = index_scheduler.webhooks();
let old_webhook = webhooks.webhooks.remove(&uuid).ok_or(WebhookNotFound(uuid))?;
if uuid.is_nil() {
return Err(ImmutableWebhook(uuid).into());
}
let mut webhooks = index_scheduler.retrieve_runtime_webhooks();
let old_webhook = webhooks.remove(&uuid).ok_or(WebhookNotFound(uuid))?;
let webhook = patch_webhook_inner(&uuid, old_webhook, webhook_settings)?;
check_changed(uuid, &webhook)?;
webhooks.webhooks.insert(uuid, webhook.clone());
index_scheduler.put_webhooks(webhooks)?;
webhooks.insert(uuid, webhook.clone());
index_scheduler.update_runtime_webhooks(webhooks)?;
analytics.publish(PatchWebhooksAnalytics::patch_webhook(), &req);
@ -468,9 +472,9 @@ async fn delete_webhook(
return Err(ImmutableWebhook(uuid).into());
}
let mut webhooks = index_scheduler.webhooks();
webhooks.webhooks.remove(&uuid).ok_or(WebhookNotFound(uuid))?;
index_scheduler.put_webhooks(webhooks)?;
let mut webhooks = index_scheduler.retrieve_runtime_webhooks();
webhooks.remove(&uuid).ok_or(WebhookNotFound(uuid))?;
index_scheduler.update_runtime_webhooks(webhooks)?;
analytics.publish(PatchWebhooksAnalytics::delete_webhook(), &req);

View File

@ -283,7 +283,6 @@ async fn reserved_names() {
let (value, code) = server
.patch_webhook(Uuid::nil().to_string(), json!({ "url": "http://localhost:8080" }))
.await;
snapshot!(code, @"400 Bad Request");
snapshot!(value, @r#"
{
"message": "Webhook `[uuid]` is immutable. The webhook defined from the command line cannot be modified using the API.",
@ -292,9 +291,9 @@ async fn reserved_names() {
"link": "https://docs.meilisearch.com/errors#immutable_webhook"
}
"#);
snapshot!(code, @"400 Bad Request");
let (value, code) = server.delete_webhook(Uuid::nil().to_string()).await;
snapshot!(code, @"400 Bad Request");
snapshot!(value, @r#"
{
"message": "Webhook `[uuid]` is immutable. The webhook defined from the command line cannot be modified using the API.",
@ -303,6 +302,7 @@ async fn reserved_names() {
"link": "https://docs.meilisearch.com/errors#immutable_webhook"
}
"#);
snapshot!(code, @"400 Bad Request");
}
#[actix_web::test]