storage

package
v2.0.0-...-c48d65c Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 10, 2026 License: Apache-2.0 Imports: 8 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type ComposableFS

type ComposableFS interface {
	UseIn(composer *tusd.StoreComposer)
}

Composable is the interface that a struct needs to implement to be composable, so that it can support the TUS methods

type CreateDirResult

type CreateDirResult struct {
	SpaceOwner *userpb.UserId
	SpaceID    string
	ResourceID *provider.ResourceId
}

type DeleteResult

type DeleteResult struct {
	// SpaceOwner is the owner of the space the deleted resource belonged to.
	SpaceOwner *userpb.UserId
	// ResourceId is the stable identifier of the deleted resource, used as ItemTrashed.ID in the published event.
	ResourceId *provider.ResourceId
}

DeleteResult is returned by FS.Delete on success. It carries the data the storageprovider wrapper needs to publish the ItemTrashed event.

type DeleteStorageSpaceResult

type DeleteStorageSpaceResult struct {
	// SpaceName is the name of the space at the time of deletion.
	SpaceName string
	// FinalMembers is the grant map of the space at the time of deletion,
	// keyed by user/group opaque id.
	FinalMembers map[string]provider.ResourcePermissions
}

DeleteStorageSpaceResult is returned by FS.DeleteStorageSpace on a successful purge. It carries the data the storageprovider wrapper needs to publish the SpaceDeleted event. The SpaceDisabled flow does not consume it.

type FS

type FS interface {

	// Shutdown is called when the process is exiting to give the driver a chance to flush and close all open handles
	Shutdown(ctx context.Context) error

	// ListStorageSpaces lists the spaces in the storage.
	// FIXME The unrestricted parameter is an implementation detail of decomposedfs, remove it from the function?
	ListStorageSpaces(ctx context.Context, filter []*provider.ListStorageSpacesRequest_Filter, unrestricted bool) ([]*provider.StorageSpace, error)

	// GetQuota returns the quota on the referenced resource
	GetQuota(ctx context.Context, ref *provider.Reference) (uint64, uint64, uint64, error)

	// GetMD returns the resuorce info for the referenced resource
	GetMD(ctx context.Context, ref *provider.Reference, mdKeys, fieldMask []string) (*provider.ResourceInfo, error)
	// ListFolder returns the resource infos for all children of the referenced resource
	ListFolder(ctx context.Context, ref *provider.Reference, mdKeys, fieldMask []string) ([]*provider.ResourceInfo, error)
	// Download returns a ReadCloser for the content of the referenced resource
	Download(ctx context.Context, ref *provider.Reference, openReaderfunc func(*provider.ResourceInfo) bool) (*provider.ResourceInfo, io.ReadCloser, error)

	// GetPathByID returns the path for the given resource id relative to the space root
	// It should only reveal the path visible to the current user to not leak the names uf unshared parent resources
	// FIXME should be deprecated in favor of calls to GetMD and the fieldmask 'path'
	GetPathByID(ctx context.Context, id *provider.ResourceId) (string, error)

	// CreateReference creates a resource of type reference
	CreateReference(ctx context.Context, path string, targetURI *url.URL) error
	// CreateDir creates a resource of type container
	CreateDir(ctx context.Context, ref *provider.Reference) (*CreateDirResult, error)
	// TouchFile sets the mtime of a resource, creating an empty file if it does not exist
	// FIXME(OCISDEV-900) remove markprocessing bool: coordinator calls MarkProcessing(true) explicitly after TouchFile
	// FIXME the mtime should either be a time.Time or a CS3 Timestamp, not a string
	TouchFile(ctx context.Context, ref *provider.Reference, markprocessing bool, mtime string) (*TouchFileResult, error)
	// Delete deletes a resource.
	// If the storage driver supports a recycle bin it should move it to the recycle bin
	// On success, returns a DeleteResult used by the wrapper to publish ItemTrashed.
	Delete(ctx context.Context, ref *provider.Reference) (*DeleteResult, error)
	// Move changes the path of a resource
	Move(ctx context.Context, oldRef, newRef *provider.Reference) (*MoveResult, error)
	// InitiateUpload returns a list of protocols with urls that can be used to append bytes to a new upload session
	InitiateUpload(ctx context.Context, ref *provider.Reference, uploadLength int64, metadata map[string]string) (map[string]string, error)
	// Upload creates or updates a resource of type file with a new revision
	Upload(ctx context.Context, req UploadRequest, uploadFunc UploadFinishedFunc) (*provider.ResourceInfo, error)
	// MarkProcessing toggles a processing flag on the resource.
	MarkProcessing(ctx context.Context, ref *provider.Reference, processing bool, sessionID string) error
	// CommitUpload writes the staged bytes from source to the resource at ref.
	// Caller owns source.Body and must close it after CommitUpload returns.
	CommitUpload(ctx context.Context, ref *provider.Reference, sessionID string, source UploadSource) error
	// PrepareUpload is called after all bytes are received and before postprocessing begins.
	// Implementations may lock the target node, snapshot the previous version, write new metadata,
	// and propagate size changes. Drivers that do not require any of these steps may return immediately.
	PrepareUpload(ctx context.Context, ref *provider.Reference, sessionID string, info UploadInfo) (*PrepareUploadResult, error)
	// RollbackUpload reverts node state after a failed or aborted postprocessing run.
	// It is the inverse of PrepareUpload: restores previous metadata and reverts the optimistic
	// size propagation. The caller (coordinator) is responsible for unmarking the processing flag
	// and deleting the upload session files. Drivers that performed no work in PrepareUpload may return nil.
	// Callers must keep the session on a returned error: the rollback is retryable and info
	// carries state the driver cannot recover once the session files are gone.
	RollbackUpload(ctx context.Context, ref *provider.Reference, sessionID string, info RollbackInfo) error

	// ListRevisions lists all revisions for the referenced resource
	ListRevisions(ctx context.Context, ref *provider.Reference) ([]*provider.FileVersion, error)
	// DownloadRevision downloads a revision
	DownloadRevision(ctx context.Context, ref *provider.Reference, key string, openReaderFunc func(md *provider.ResourceInfo) bool) (*provider.ResourceInfo, io.ReadCloser, error)
	// RestoreRevision restores a revision
	RestoreRevision(ctx context.Context, ref *provider.Reference, key string) (*RestoreRevisionResult, error)

	// ListRecycle lists the content of the recycle bin
	ListRecycle(ctx context.Context, ref *provider.Reference, key, relativePath string) ([]*provider.RecycleItem, error)
	// RestoreRecycleItem restores an item from the recyle bin
	// if restoreRef is nil the resource should be restored at the original path
	RestoreRecycleItem(ctx context.Context, ref *provider.Reference, key, relativePath string, restoreRef *provider.Reference) (*RestoreRecycleItemResult, error)
	// PurgeRecycleItem removes a resource from the recycle bin
	PurgeRecycleItem(ctx context.Context, ref *provider.Reference, key, relativePath string) error
	// EmptyRecycle removes all resource from the recycle bin
	EmptyRecycle(ctx context.Context, ref *provider.Reference) error

	// AddGrant adds a grant to a resource
	AddGrant(ctx context.Context, ref *provider.Reference, g *provider.Grant) error
	// DenyGrant marks a resource as denied for a recipient
	// The resource and its children must be completely hidden for the recipient
	DenyGrant(ctx context.Context, ref *provider.Reference, g *provider.Grantee) error
	// RemoveGrant removes a grant from a resource
	RemoveGrant(ctx context.Context, ref *provider.Reference, g *provider.Grant) error
	// UpdateGrant updates a grant on a resource
	UpdateGrant(ctx context.Context, ref *provider.Reference, g *provider.Grant) error
	// ListGrants lists all grants on a resource
	ListGrants(ctx context.Context, ref *provider.Reference) ([]*provider.Grant, error)

	// SetArbitraryMetadata sets arbitraty metadata on a resource
	SetArbitraryMetadata(ctx context.Context, ref *provider.Reference, md *provider.ArbitraryMetadata) error
	// UnsetArbitraryMetadata removes arbitraty metadata from a resource
	UnsetArbitraryMetadata(ctx context.Context, ref *provider.Reference, keys []string) error

	// GetLock returns an existing lock on the given reference
	GetLock(ctx context.Context, ref *provider.Reference) (*provider.Lock, error)
	// SetLock puts a lock on the given reference
	SetLock(ctx context.Context, ref *provider.Reference, lock *provider.Lock) (*SetLockResult, error)
	// RefreshLock refreshes an existing lock on the given reference
	RefreshLock(ctx context.Context, ref *provider.Reference, lock *provider.Lock, existingLockID string) error
	// Unlock removes an existing lock from the given reference
	Unlock(ctx context.Context, ref *provider.Reference, lock *provider.Lock) (*UnlockResult, error)

	// CreateStorageSpace creates a storage space
	CreateStorageSpace(ctx context.Context, req *provider.CreateStorageSpaceRequest) (*provider.CreateStorageSpaceResponse, error)
	// UpdateStorageSpace updates a storage space
	UpdateStorageSpace(ctx context.Context, req *provider.UpdateStorageSpaceRequest) (*provider.UpdateStorageSpaceResponse, error)
	// DeleteStorageSpace deletes a storage space.
	// On a successful delete (purge), returns a DeleteStorageSpaceResult used by
	// the wrapper to publish SpaceDeleted. SpaceDisabled does not need this data.
	DeleteStorageSpace(ctx context.Context, req *provider.DeleteStorageSpaceRequest) (*DeleteStorageSpaceResult, error)

	// CreateHome creates a users home
	// Deprecated: use CreateStorageSpace with type personal
	CreateHome(ctx context.Context) error
	// GetHome returns the path to the users home
	// Deprecated: use ListStorageSpaces with type personal
	GetHome(ctx context.Context) (string, error)
}

FS is the interface to implement access to the storage.

type MoveResult

type MoveResult struct {
	SpaceOwner   *user.UserId
	OldReference *provider.Reference
	NewReference *provider.Reference
}

type OrphanChecker

type OrphanChecker interface {
	// IsOrphaned reports whether the referenced resource exists but its metadata is unreadable.
	IsOrphaned(ctx context.Context, ref *provider.Reference) bool
}

OrphanChecker defines the interface for FS implementations that can resolve a resource's metadata.

type PathWrapper

type PathWrapper interface {
	Unwrap(ctx context.Context, rp string) (string, error)
	Wrap(ctx context.Context, rp string) (string, error)
}

PathWrapper is the interface to implement for path transformations

type PrepareUploadResult

type PrepareUploadResult struct {
	VersionCreated bool
	SizeDiff       int64
}

type Registry

type Registry interface {
	// GetProvider returns the Address of the storage provider that should be used for the given space.
	// Use it to determine where to create a new storage space.
	GetProvider(ctx context.Context, space *provider.StorageSpace) (*registry.ProviderInfo, error)
	// ListProviders returns the storage providers that match the given filter
	ListProviders(ctx context.Context, filters map[string]string) ([]*registry.ProviderInfo, error)
}

Registry is the interface that storage registries implement for discovering storage providers

type RestoreRecycleItemResult

type RestoreRecycleItemResult struct {
	SpaceOwner *userpb.UserId
	SpaceID    string
}

type RestoreRevisionResult

type RestoreRevisionResult struct {
	SpaceOwner *userpb.UserId
	SpaceID    string
}

type RollbackInfo

type RollbackInfo struct {
	NodeExisted bool // true when the target node had a prior version; drivers with nothing to undo for new nodes may no-op
	SizeDiff    int64
	NodeID      string
	ParentID    string
	Filename    string
	Size        int64
}

RollbackInfo carries what a driver needs to undo PrepareUpload. NodeID and ParentID come from the upload session rather than the node, so a rollback can still release the quota of a node whose own metadata has become unreadable.

type SetLockResult

type SetLockResult struct {
	SpaceOwner *userpb.UserId
	SpaceID    string
}

type TouchFileResult

type TouchFileResult struct {
	SpaceOwner *userpb.UserId
	SpaceID    string
	ResourceID *provider.ResourceId
}

type UnlockResult

type UnlockResult struct {
	SpaceOwner *userpb.UserId
	SpaceID    string
}

type UnscopeFunc

type UnscopeFunc func()

UnscopeFunc is a function that unscopes a user

type UploadChecksums

type UploadChecksums struct {
	SHA1    []byte
	MD5     []byte
	Adler32 []byte
}

type UploadFinishedFunc

type UploadFinishedFunc func(spaceOwner, executant *userpb.UserId, ref *provider.Reference)

UploadFinishedFunc is a callback function used in storage drivers to indicate that an upload has finished

type UploadInfo

type UploadInfo struct {
	NodeExisted       bool // true when the target node existed before the upload started
	Size              int64
	MTime             time.Time
	Checksums         UploadChecksums
	IfMatch           string
	IfNoneMatch       string
	IfUnmodifiedSince time.Time
}

type UploadRequest

type UploadRequest struct {
	Ref    *provider.Reference
	Body   io.ReadCloser
	Length int64
}

UploadRequest us used in FS.Upload() to carry required upload metadata

type UploadSession

type UploadSession interface {
	// ID returns the upload id
	ID() string
	// Filename returns the filename of the file
	Filename() string
	// Size returns the size of the upload
	Size() int64
	// Offset returns the current offset
	Offset() int64
	// Reference returns a reference for the file being uploaded. May be absolute id based or relative to e.g. a space root
	Reference() provider.Reference
	// Executant returns the userid of the user that created the upload
	Executant() userpb.UserId
	// SpaceOwner returns the owner of a space if set. optional
	SpaceOwner() *userpb.UserId
	// Expires returns the time when the upload can no longer be used
	Expires() time.Time

	// IsProcessing returns true if postprocessing has not finished, yet
	// The actual postprocessing state is tracked in the postprocessing service.
	IsProcessing() bool

	// Purge allows completely removing an upload.
	Purge(ctx context.Context)

	// ScanData returns the scan data for the UploadSession
	ScanData() (string, time.Time)
}

UploadSession is the interface that storage drivers need to return whan listing upload sessions.

type UploadSessionFilter

type UploadSessionFilter struct {
	ID         *string
	Processing *bool
	Expired    *bool
	HasVirus   *bool
	// Orphaned filters sessions by whether their target node can still be
	// resolved. Evaluating it requires reading the node metadata of every
	// session, so it is only evaluated when set.
	Orphaned *bool
}

UploadSessionFilter can be used to filter upload sessions

type UploadSessionLister

type UploadSessionLister interface {
	// ListUploadSessions returns the upload sessions matching the given filter
	ListUploadSessions(ctx context.Context, filter UploadSessionFilter) ([]UploadSession, error)
}

UploadSessionLister defines the interface for FS implementations that allow listing and purging upload sessions

type UploadSource

type UploadSource struct {
	Body   io.ReadCloser
	Length int64

	// ScanResult is the antivirus verdict: empty means clean.
	ScanResult string
	// ScanDate is zero when the upload was not scanned.
	ScanDate time.Time
}

UploadSource carries the staged bytes for a CommitUpload call.

type UploadsManager

type UploadsManager interface {
	ListUploads() ([]tusd.FileInfo, error)
	PurgeExpiredUploads(chan<- tusd.FileInfo) error
}

UploadsManager defines the interface for storage drivers that allow for managing uploads Deprecated: No longer used. Storage drivers should implement the UploadSessionLister.

Directories

Path Synopsis
fs
eos
s3
utils
ace
acl
indexer
Package indexer provides symlink-based indexer for on-disk document-directories.
Package indexer provides symlink-based indexer for on-disk document-directories.
templates
Package templates contains data-driven templates for path layouts.
Package templates contains data-driven templates for path layouts.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL