diff --git a/internal/endpoint/endpoint.go b/internal/endpoint/endpoint.go index f0ae201..0e4dfbc 100644 --- a/internal/endpoint/endpoint.go +++ b/internal/endpoint/endpoint.go @@ -80,6 +80,28 @@ func NewSender(conf SenderConfig) *Sender { } func (s *Sender) filterCheckFS(fs string) (*zfs.DatasetPath, error) { + // Патч: если fs пришёл без pool (nomad/...), добавляем source pool обратно + // (но только если он не полный) + p, err := zfs.NewDatasetPath(fs) + if err != nil { + return nil, err + } + + // Если путь короткий (без pool) — добавляем первый компонент из job config или пропускаем + // Но проще: если длина < 2, то это уже "очищенный" путь — пропускаем проверку или добавляем + if p.Length() <= 1 { + // Просто проверяем фильтр как есть + pass, err := s.FSFilter.Filter(p) + if err != nil { + return nil, err + } + if !pass { + return nil, fmt.Errorf("endpoint does not allow access to filesystem %s", fs) + } + return p, nil + } + + // Обычный путь dp, err := zfs.NewDatasetPath(fs) if err != nil { return nil, err @@ -97,6 +119,7 @@ func (s *Sender) filterCheckFS(fs string) (*zfs.DatasetPath, error) { return dp, nil } + func (s *Sender) ListFilesystems(ctx context.Context, r *pdu.ListFilesystemReq) (*pdu.ListFilesystemRes, error) { defer trace.WithSpanFromStackUpdateCtx(&ctx)()