P1: Booker (любой JWT) может confirm чужую/свою заявку — нет ACL #53
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Проблема
PUT /v1/bookings/{id}сaction=confirmне проверяет, что вызывающий — владелец календаря/события (или admin). Вlogic_booking:confirm_booking/2аргумент пользователя помечен как_UserIdи игнорируется: любой аутентифицированный пользователь может подтвердить любуюpending-заявку.Stage QA: booker (smoke-user) подтвердил свою заявку
c6kW9Towqfe9y6hOcrVFHgна чужое событиеggek0yrBKg0YFwHUwvNCKg→ 200 confirmed. Ожидалось 403.Спека (
EventHubBackSpec§2.3): «Владелец календаря может подтвердить или отклонить заявку»; участник может только отменить свою запись. Handler-комментарий тоже говорит «владельцем», но ACL в logic отсутствует.Дополнительно: handler принимает
action=decline, но вconfirm_booking/3есть только clause дляconfirm—declineможет даватьfunction_clause/500 вместо осмысленного ответа.Влияние
Нарушение модели доверия для
confirmation=manual: booker (и любой другой JWT) может сам подтвердить запись → обход ручного approve владельца, искажение capacity/статусов, ложный gate для отзывов (confirmed booking).Ожидаемый результат
cancelledили отдельное правило по спеке) без function_clause.Критерии приёмки
PUT … action=confirm→ 403PUT … action=confirm→ 200, status=confirmedaction=declineработает по согласованному правилу + ACL как у confirmtest_booking_event_fullкак раз вызывает confirm от participant — поправить)Варианты решения
confirm_booking/2(и decline) ACL как уlist_event_bookings/2: event → calendar →owner_id =:= UserId orelse admin_utils:is_admin(UserId); иначеaccess_denied. Переиспользовать общий helpercan_manage_event_bookings/2.decide_booking(UserId, BookingId, Action)с явной матрицей ролей + тесты; handler только вызывает её.Файлы (подсказка)
src/logic/logic_booking.erl(confirm_booking/2,/3; сравнить сlist_event_bookings/2)src/handlers/handler_booking_by_id.erl(update_booking)test/unit/logic_booking_tests.erlПриоритет
P1 (по факту шире, чем «booker self-confirm»: любой auth user)
Реализуем вариант 1: ACL как у
list_event_bookings/2— confirm/decline только владелец календаря или admin; booker/посторонний → 403. Общий helpercan_manage_event_bookings, правка decline при необходимости, обновление unit-тестов.Готово.
Что сделано
list_event_bookings/2: только владелец календаря или admin.can_manage_event_bookings/2;action=decline→cancelled.Тесты
logic_booking_tests: 18/0booking_integration_tests: 4/0Коммит
fdb08eb— pushed tomaster.Спека уже описывала владельца календаря — правки EventHubSpec не нужны.
Проверено на stage после деплоя
fdb08eb(API build 153):PUT /v1/bookings/:idaction=confirm на свежую pending → 403 Access denied