у записи появился владелец: чужую больше не отдают
- колонка `owner` связью с `users` в обеих коллекциях новым шагом схемы `202608140001`; чтение задачи сужено владельцем, и чужая, ничья и несуществующая дают один ответ; правило просмотра файлов сужено им же - приём по HTTP берёт владельца из сессии, а предъявителя без учётной записи пользователя отвергает до чтения тела: позже пришлось бы убирать уложенный файл, а уборки файлов сервис не умеет. Выборка воркера владельцем не сужается - удаление учётной записи с записями отвергается стражем, и вешает его сама сборка хранилища: сборка, забывшая его позвать, теряла защиту молча
This commit is contained in:
@@ -87,10 +87,24 @@ func (s *TranscribeService) CreateJobFromTelegram(ctx context.Context, file io.R
|
||||
return s.createTranscribeJob(ctx, job, file, fileName)
|
||||
}
|
||||
|
||||
func (s *TranscribeService) CreateJobFromApi(ctx context.Context, file io.Reader, fileName string) (*entity.TranscribeJob, error) {
|
||||
// CreateJobFromApi заводит задачу от имени вошедшего. Владелец обязателен:
|
||||
// пустой отвергается здесь, потому что колонка владельца допускает пустое
|
||||
// значение ради записей бота, и приём по HTTP — то место, где обязательность
|
||||
// держится.
|
||||
//
|
||||
// Отказ этот — последний рубеж, а не первый: предъявителя без учётной записи
|
||||
// пользователя транспорт отвергает раньше, до чтения тела. Здесь он остаётся на
|
||||
// случай нового вызывающего, который такой проверки не поставит.
|
||||
func (s *TranscribeService) CreateJobFromApi(ctx context.Context, file io.Reader, fileName, ownerID string) (*entity.TranscribeJob, error) {
|
||||
if ownerID == "" {
|
||||
s.logger.Error("Refusing to create job without owner")
|
||||
return nil, contract.ErrOwnerRequired
|
||||
}
|
||||
|
||||
job := &entity.TranscribeJob{
|
||||
State: entity.StateCreated,
|
||||
Source: entity.SourceApi,
|
||||
State: entity.StateCreated,
|
||||
Source: entity.SourceApi,
|
||||
OwnerID: &ownerID,
|
||||
}
|
||||
|
||||
return s.createTranscribeJob(ctx, job, file, fileName)
|
||||
@@ -135,7 +149,7 @@ func (s *TranscribeService) createTranscribeJob(ctx context.Context, job *entity
|
||||
return nil, err
|
||||
}
|
||||
|
||||
fileRecord, err := s.fileRepo.CreateLocal(storageFileName, work)
|
||||
fileRecord, err := s.fileRepo.CreateLocal(storageFileName, work, ownerOf(job))
|
||||
if err != nil {
|
||||
s.logger.Error("Failed to create file record", "error", err, "file_ext", ext)
|
||||
return nil, err
|
||||
@@ -284,7 +298,7 @@ func (s *TranscribeService) convertJob(ctx context.Context, job *entity.Transcri
|
||||
metrics.OutputFileSizeHistogram.WithLabelValues("ogg").Observe(float64(destSize))
|
||||
|
||||
destFileName := fmt.Sprintf("%s%s", uuid.NewString(), ".ogg")
|
||||
destFileRecord, err := s.fileRepo.CreateLocal(destFileName, dest)
|
||||
destFileRecord, err := s.fileRepo.CreateLocal(destFileName, dest, ownerOf(job))
|
||||
if err != nil {
|
||||
s.logger.Error("Failed to create converted file record", "error", err, "job_id", job.Id)
|
||||
return err
|
||||
@@ -346,7 +360,7 @@ func (s *TranscribeService) transcribeJob(ctx context.Context, job *entity.Trans
|
||||
"job_id", job.Id,
|
||||
"operation_id", operationID)
|
||||
|
||||
destFileRecord, err := s.fileRepo.CreateRemote(fileRecord.FileName, fileRecord.Size)
|
||||
destFileRecord, err := s.fileRepo.CreateRemote(fileRecord.FileName, fileRecord.Size, ownerOf(job))
|
||||
if err != nil {
|
||||
s.logger.Error("Failed to create S3 file record", "error", err, "job_id", job.Id)
|
||||
return err
|
||||
@@ -635,3 +649,14 @@ func (s *TranscribeService) closeWork(work contract.WorkFile) {
|
||||
s.logger.Error("Failed to remove work file", "error", err)
|
||||
}
|
||||
}
|
||||
|
||||
// ownerOf — владелец задачи строкой; пустая значит «владельца нет», и таковы
|
||||
// записи, принятые ботом. Файл наследует владельца своей задачи: правило
|
||||
// просмотра коллекции файлов сужено этой колонкой, и файл, заведённый шагом
|
||||
// конвейера без неё, перестал бы доставаться собственному владельцу.
|
||||
func ownerOf(job *entity.TranscribeJob) string {
|
||||
if job.OwnerID == nil {
|
||||
return ""
|
||||
}
|
||||
return *job.OwnerID
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user