Documentation
¶
Index ¶
- Constants
- Variables
- func AddPermissions(l *provider.ResourcePermissions, r *provider.ResourcePermissions)
- func CalculateEtag(nodeID string, tmTime time.Time) (string, error)
- func GetAvailableSize(path string) (uint64, error)
- func NoPermissions() provider.ResourcePermissions
- func OwnerPermissions() provider.ResourcePermissions
- func ReadBlobIDAttr(path string) (string, error)
- func ReadBlobSizeAttr(path string) (int64, error)
- func ShareFolderPermissions() provider.ResourcePermissions
- type Node
- func (n *Node) AsResourceInfo(ctx context.Context, rp *provider.ResourcePermissions, ...) (ri *provider.ResourceInfo, err error)
- func (n *Node) ChangeOwner(new *userpb.UserId) (err error)
- func (n *Node) CheckLock(ctx context.Context) error
- func (n *Node) Child(ctx context.Context, name string) (*Node, error)
- func (n *Node) FindStorageSpaceRoot() error
- func (n *Node) GetBlobSize() (treesize uint64, err error)
- func (n *Node) GetDTime() (tmTime time.Time, err error)
- func (n *Node) GetTMTime() (tmTime time.Time, err error)
- func (n *Node) GetTreeSize() (treesize uint64, err error)
- func (n *Node) HasPropagation() (propagation bool)
- func (n *Node) InternalPath() string
- func (n *Node) IsDenied(ctx context.Context) bool
- func (n *Node) IsDir() bool
- func (n *Node) IsDisabled() bool
- func (n *Node) IsSpaceRoot() bool
- func (n *Node) ListGrantees(ctx context.Context) (grantees []string, err error)
- func (n *Node) ListGrants(ctx context.Context) ([]*provider.Grant, error)
- func (n *Node) LockFilePath() string
- func (n *Node) Owner() *userpb.UserId
- func (n *Node) Parent() (p *Node, err error)
- func (n *Node) ParentInternalPath() string
- func (n *Node) PermissionSet(ctx context.Context) (provider.ResourcePermissions, bool)
- func (n *Node) ReadGrant(ctx context.Context, grantee string) (g *provider.Grant, err error)
- func (n Node) ReadLock(ctx context.Context, skipFileLock bool) (*provider.Lock, error)
- func (n *Node) ReadUserPermissions(ctx context.Context, u *userpb.User) (ap provider.ResourcePermissions, accessDenied bool, err error)
- func (n *Node) RefreshLock(ctx context.Context, lock *provider.Lock, existingLockID string) error
- func (n *Node) RemoveXattr(key string) error
- func (n *Node) SetChecksum(csType string, h hash.Hash) (err error)
- func (n *Node) SetDTime(t *time.Time) (err error)
- func (n *Node) SetEtag(ctx context.Context, val string) (err error)
- func (n *Node) SetFavorite(uid *userpb.UserId, val string) error
- func (n *Node) SetLock(ctx context.Context, lock *provider.Lock) error
- func (n *Node) SetMtime(mtime time.Time) error
- func (n *Node) SetMtimeString(mtime string) error
- func (n *Node) SetTMTime(t *time.Time) (err error)
- func (n *Node) SetTreeSize(ts uint64) (err error)
- func (n *Node) SetXattr(key, val string) (err error)
- func (n *Node) SetXattrWithLock(key, val string, fileLock *flock.Flock) (err error)
- func (n *Node) SetXattrs(attribs map[string]string) (err error)
- func (n *Node) SetXattrsWithLock(attribs map[string]string, fileLock *flock.Flock) (err error)
- func (n *Node) SpaceOwnerOrManager(ctx context.Context) *userpb.UserId
- func (n *Node) Unlock(ctx context.Context, lock *provider.Lock) error
- func (n *Node) UnsetTempEtag() (err error)
- func (n *Node) WriteAllNodeMetadata() (err error)
- func (n *Node) WriteOwner(owner *userpb.UserId) error
- func (n *Node) Xattr(key string) (string, error)
- func (n *Node) Xattrs() (map[string]string, error)
- type PathLookup
- type Permissions
Constants ¶
const ( LockdiscoveryKey = "DAV:lockdiscovery" FavoriteKey = "http://owncloud.org/ns/favorite" ChecksumsKey = "http://owncloud.org/ns/checksums" QuotaKey = "quota" QuotaUnlimited = "0" QuotaUncalculated = "-1" QuotaUnknown = "-2" // TrashIDDelimiter represents the characters used to separate the nodeid and the deletion time. TrashIDDelimiter = ".T." RevisionIDDelimiter = ".REV." // RootID defines the root node's ID RootID = "root" )
Define keys and values used in the node metadata
Variables ¶
var CheckQuota = func(spaceRoot *Node, overwrite bool, oldSize, newSize uint64) (quotaSufficient bool, err error) { used, _ := spaceRoot.GetTreeSize() if !enoughDiskSpace(spaceRoot.InternalPath(), newSize) { return false, errtypes.InsufficientStorage("disk full") } quotaByteStr, _ := spaceRoot.Xattr(xattrs.QuotaAttr) if quotaByteStr == "" || quotaByteStr == QuotaUnlimited { return true, nil } quotaByte, _ := strconv.ParseUint(quotaByteStr, 10, 64) if overwrite { if quotaByte < used-oldSize+newSize { return false, errtypes.InsufficientStorage("quota exceeded") } } else if newSize > quotaByte-used || quotaByte < used { return false, errtypes.InsufficientStorage("quota exceeded") } return true, nil }
CheckQuota checks if both disk space and available quota are sufficient Overwrite must be set to true if the new file replaces the old file e.g. when creating a new file version. In such a case the function will reduce the used bytes by the old file size and then add the new size. If overwrite is false oldSize will be ignored.
Functions ¶
func AddPermissions ¶
func AddPermissions(l *provider.ResourcePermissions, r *provider.ResourcePermissions)
AddPermissions merges a set of permissions into another TODO we should use a bitfield for this ...
func CalculateEtag ¶
CalculateEtag returns a hash of fileid + tmtime (or mtime)
func GetAvailableSize ¶
GetAvailableSize stats the filesystem and return the available bytes
func NoPermissions ¶
func NoPermissions() provider.ResourcePermissions
NoPermissions represents an empty set of permissions
func OwnerPermissions ¶
func OwnerPermissions() provider.ResourcePermissions
OwnerPermissions defines permissions for nodes owned by the user
func ReadBlobIDAttr ¶ added in v2.4.0
ReadBlobIDAttr reads the blobsize from the xattrs
func ReadBlobSizeAttr ¶
ReadBlobSizeAttr reads the blobsize from the xattrs
func ShareFolderPermissions ¶
func ShareFolderPermissions() provider.ResourcePermissions
ShareFolderPermissions defines permissions for the shared jail
Types ¶
type Node ¶
type Node struct { SpaceID string ParentID string ID string Name string Blobsize int64 BlobID string Exists bool SpaceRoot *Node // contains filtered or unexported fields }
Node represents a node in the tree and provides methods to get a Parent or Child instance
func New ¶
func New(spaceID, id, parentID, name string, blobsize int64, blobID string, owner *userpb.UserId, lu PathLookup) *Node
New returns a new instance of Node
func ReadNode ¶
func ReadNode(ctx context.Context, lu PathLookup, spaceID, nodeID string, canListDisabledSpace bool) (n *Node, err error)
ReadNode creates a new instance from an id and checks if it exists
func (*Node) AsResourceInfo ¶
func (n *Node) AsResourceInfo(ctx context.Context, rp *provider.ResourcePermissions, mdKeys, fieldMask []string, returnBasename bool) (ri *provider.ResourceInfo, err error)
AsResourceInfo return the node as CS3 ResourceInfo
func (*Node) ChangeOwner ¶
ChangeOwner sets the owner of n to newOwner
func (*Node) FindStorageSpaceRoot ¶
FindStorageSpaceRoot calls n.Parent() and climbs the tree until it finds the space root node and adds it to the node
func (*Node) GetBlobSize ¶ added in v2.12.0
GetBlobSize reads the blobsize from the extended attributes
func (*Node) GetTreeSize ¶
GetTreeSize reads the treesize from the extended attributes
func (*Node) HasPropagation ¶
HasPropagation checks if the propagation attribute exists and is set to "1"
func (*Node) InternalPath ¶
InternalPath returns the internal path of the Node
func (*Node) IsDisabled ¶
IsDisabled returns true when the node has a dmtime attribute set only used to check if a space is disabled FIXME confusing with the trash logic
func (*Node) IsSpaceRoot ¶ added in v2.12.0
IsSpaceRoot checks if the node is a space root
func (*Node) ListGrantees ¶
ListGrantees lists the grantees of the current node We don't want to wast time and memory by creating grantee objects. The function will return a list of opaque strings that can be used to make a ReadGrant call
func (*Node) ListGrants ¶
ListGrants lists all grants of the current node.
func (*Node) LockFilePath ¶
LockFilePath returns the internal path of the lock file of the node
func (*Node) ParentInternalPath ¶
ParentInternalPath returns the internal path of the parent of the current node
func (*Node) PermissionSet ¶
PermissionSet returns the permission set and an accessDenied flag for the current user the parent nodes are not taken into account accessDenied is separate from the resource permissions because we only support full denials
func (*Node) ReadUserPermissions ¶
func (n *Node) ReadUserPermissions(ctx context.Context, u *userpb.User) (ap provider.ResourcePermissions, accessDenied bool, err error)
ReadUserPermissions will assemble the permissions for the current user on the given node without parent nodes we indicate if the access was denied by setting a grant with no permissions
func (*Node) RefreshLock ¶
RefreshLock refreshes the node's lock
func (*Node) RemoveXattr ¶ added in v2.12.0
RemoveXattr removes an extended attribute from the write-through cache/node
func (*Node) SetChecksum ¶
SetChecksum writes the checksum with the given checksum type to the extended attributes
func (*Node) SetDTime ¶
SetDTime writes the UTC dtime to the extended attributes or removes the attribute if nil is passed
func (*Node) SetEtag ¶
SetEtag sets the temporary etag of a node if it differs from the current etag
func (*Node) SetFavorite ¶
SetFavorite sets the favorite for the current user TODO we should not mess with the user here ... the favorites is now a user specific property for a file that cannot be mapped to extended attributes without leaking who has marked a file as a favorite it is a specific case of a tag, which is user individual as well TODO there are different types of tags 1. public that are managed by everyone 2. private tags that are only visible to the user 3. system tags that are only visible to the system 4. group tags that are only visible to a group ... urgh ... well this can be solved using different namespaces 1. public = p: 2. private = u:<uid>: for user specific 3. system = s: for system 4. group = g:<gid>: 5. app? = a:<aid>: for apps? obviously this only is secure when the u/s/g/a namespaces are not accessible by users in the filesystem public tags can be mapped to extended attributes
func (*Node) SetMtimeString ¶ added in v2.12.0
SetMtimeString sets the mtime and atime of a node to the unixtime parsed from the given string
func (*Node) SetTMTime ¶
SetTMTime writes the UTC tmtime to the extended attributes or removes the attribute if nil is passed
func (*Node) SetTreeSize ¶
SetTreeSize writes the treesize to the extended attributes
func (*Node) SetXattr ¶ added in v2.12.0
SetXattr sets an extended attribute on the write-through cache/node
func (*Node) SetXattrWithLock ¶ added in v2.12.0
SetXattrWithLock sets an extended attribute on the write-through cache/node with the given lock
func (*Node) SetXattrs ¶ added in v2.12.0
SetXattrs sets multiple extended attributes on the write-through cache/node
func (*Node) SetXattrsWithLock ¶ added in v2.12.0
SetXattrsWithLock sets multiple extended attributes on the write-through cache/node with a given lock
func (*Node) SpaceOwnerOrManager ¶ added in v2.11.0
SpaceOwnerOrManager returns the space owner of the space. If no owner is set one of the space managers is returned instead.
func (*Node) UnsetTempEtag ¶
UnsetTempEtag removes the temporary etag attribute
func (*Node) WriteAllNodeMetadata ¶
WriteAllNodeMetadata writes the Node metadata to disk
func (*Node) WriteOwner ¶
WriteOwner writes the space owner
type PathLookup ¶
type PathLookup interface { InternalRoot() string InternalPath(spaceID, nodeID string) string Path(ctx context.Context, n *Node) (path string, err error) }
PathLookup defines the interface for the lookup component
type Permissions ¶
type Permissions struct {
// contains filtered or unexported fields
}
Permissions implements permission checks
func NewPermissions ¶
func NewPermissions(lu PathLookup) *Permissions
NewPermissions returns a new Permissions instance
func (*Permissions) AssemblePermissions ¶
func (p *Permissions) AssemblePermissions(ctx context.Context, n *Node) (ap provider.ResourcePermissions, err error)
AssemblePermissions will assemble the permissions for the current user on the given node, taking into account all parent nodes