Whether an archive entry name can escape the archive's namespace was left entirely to each archiver. Enforce it in the archive backend too. List only passes on direct children of the directory listed and NewObject only returns the object asked for, so a future archiver which forgets to validate names cannot expose a traversal to fs/sync and fs/operations.
30 lines
876 B
Go
30 lines
876 B
Go
// Package archiver registers all the archivers
|
|
package archiver
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/rclone/rclone/fs"
|
|
)
|
|
|
|
// Archiver describes an archive package
|
|
//
|
|
// Entry names inside an archive are attacker controlled. An archiver
|
|
// must not expose an entry whose remote escapes the archive's own
|
|
// namespace (for example one with a ".." component), typically by
|
|
// validating names with lib/sanitize.
|
|
type Archiver struct {
|
|
// New constructs an Fs from the (wrappedFs, remote) with the objects
|
|
// prefix with prefix and rooted at root
|
|
New func(ctx context.Context, f fs.Fs, remote, prefix, root string) (fs.Fs, error)
|
|
Extension string
|
|
}
|
|
|
|
// Archivers is a slice of all registered archivers
|
|
var Archivers []Archiver
|
|
|
|
// Register adds the archivers provided to the list of known archivers
|
|
func Register(as ...Archiver) {
|
|
Archivers = append(Archivers, as...)
|
|
}
|