у записи появился владелец: чужую больше не отдают
- колонка `owner` связью с `users` в обеих коллекциях новым шагом схемы `202608140001`; чтение задачи сужено владельцем, и чужая, ничья и несуществующая дают один ответ; правило просмотра файлов сужено им же - приём по HTTP берёт владельца из сессии, а предъявителя без учётной записи пользователя отвергает до чтения тела: позже пришлось бы убирать уложенный файл, а уборки файлов сервис не умеет. Выборка воркера владельцем не сужается - удаление учётной записи с записями отвергается стражем, и вешает его сама сборка хранилища: сборка, забывшая его позвать, теряла защиту молча
This commit is contained in:
@@ -9,6 +9,7 @@ import (
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"sync"
|
||||
"syscall"
|
||||
"time"
|
||||
@@ -231,7 +232,7 @@ func main() {
|
||||
|
||||
logger.Log(e.Request.Context(), level, "Incoming request",
|
||||
"http.method", e.Request.Method,
|
||||
"http.route", e.Request.URL.Path,
|
||||
"http.route", journalRoute(e.Request.URL.Path),
|
||||
"http.status_code", e.Status(),
|
||||
"duration_ms", time.Since(start).Milliseconds(),
|
||||
"transport", "http")
|
||||
@@ -344,3 +345,30 @@ func main() {
|
||||
|
||||
logger.Info("Transcriber service stopped")
|
||||
}
|
||||
|
||||
// filesPathPrefix — начало пути, которым хранилище отдаёт файл записи. Последний
|
||||
// сегмент такого пути и есть имя файла в хранилище.
|
||||
const filesPathPrefix = "/api/files/"
|
||||
|
||||
// journalRoute готовит путь запроса к записи в журнал.
|
||||
//
|
||||
// Инвариант проекта запрещает имени файла в хранилище попадать в журнал: имя —
|
||||
// последняя часть ссылки `/api/files/...`, и строка журнала вместе с
|
||||
// идентификатором записи собирала бы ссылку целиком. Слой журнала пишет путь
|
||||
// всякого запроса, поэтому имя срезается здесь — иначе оно уезжало бы в
|
||||
// собранные логи при каждом скачивании записи.
|
||||
//
|
||||
// Срезается только имя: маршрут остаётся различимым, и наблюдаемость от этого не
|
||||
// теряется.
|
||||
func journalRoute(path string) string {
|
||||
if !strings.HasPrefix(path, filesPathPrefix) {
|
||||
return path
|
||||
}
|
||||
|
||||
cut := strings.LastIndex(path, "/")
|
||||
if cut < len(filesPathPrefix) {
|
||||
return path
|
||||
}
|
||||
|
||||
return path[:cut+1] + "<имя>"
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user