Add loop protection

This commit is contained in:
2023-08-05 12:10:23 +02:00
parent eaf09135f4
commit 5506149efc
3 changed files with 98 additions and 1 deletions

View File

@ -262,6 +262,20 @@ pub async fn update(m: FamilyAndMemberInPath, req: web::Json<MemberRequest>) ->
return Ok(HttpResponse::BadRequest().body(e.to_string()));
}
// Check for potential loops
let members = members_service::get_all_of_family(member.family_id()).await?;
let mut members_ref = Vec::with_capacity(members.len());
members_ref.push(&member);
for m in &members {
if m.id() != member.id() {
members_ref.push(m);
}
}
if members_service::loop_detection::detect_loop(&members_ref) {
log::warn!("Membership update rejected due to detected loop!");
return Ok(HttpResponse::NotAcceptable().json("Loop detected!"));
}
members_service::update(&mut member).await?;
Ok(HttpResponse::Accepted().finish())