blob: 71aa3a1e7a015d9d0a41847611b5535397aa8e8a [file] [log] [blame]
// Copyright 2015 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package permissions defines an interface for managing access control
// permissions.
package permissions
import (
"v.io/v23/security/access"
)
// Object provides access control for Vanadium objects.
//
// Vanadium services implementing dynamic access control would typically embed
// this interface and tag additional methods defined by the service with one of
// Admin, Read, Write, Resolve etc. For example, the VDL definition of the
// object would be:
//
// package mypackage
//
// import "v.io/v23/security/access"
// import "v.io/v23/services/permissions"
//
// type MyObject interface {
// permissions.Object
// MyRead() (string, error) {access.Read}
// MyWrite(string) error {access.Write}
// }
//
// If the set of pre-defined tags is insufficient, services may define their
// own tag type and annotate all methods with this new type.
//
// Instead of embedding this Object interface, define SetPermissions and
// GetPermissions in their own interface. Authorization policies will typically
// respect annotations of a single type. For example, the VDL definition of an
// object would be:
//
// package mypackage
//
// import "v.io/v23/security/access"
//
// type MyTag string
//
// const (
// Blue = MyTag("Blue")
// Red = MyTag("Red")
// )
//
// type MyObject interface {
// MyMethod() (string, error) {Blue}
//
// // Allow clients to change access via the access.Object interface:
// SetPermissions(perms access.Permissions, version string) error {Red}
// GetPermissions() (perms access.Permissions, version string, err error) {Blue}
// }
type Object interface {
// SetPermissions replaces the current Permissions for an object. version
// allows for optional, optimistic concurrency control. If non-empty,
// version's value must come from GetPermissions. If any client has
// successfully called SetPermissions in the meantime, the version will be
// stale and SetPermissions will fail. If empty, SetPermissions performs an
// unconditional update.
//
// Permissions objects are expected to be small. It is up to the
// implementation to define the exact limit, though it should probably be
// around 100KB. Large lists of principals can be represented concisely using
// blessings.
//
// There is some ambiguity when calling SetPermissions on a mount point.
// Does it affect the mount itself or does it affect the service endpoint
// that the mount points to? The chosen behavior is that it affects the
// service endpoint. To modify the mount point's Permissions, use
// ResolveToMountTable to get an endpoint and call SetPermissions on that.
// This means that clients must know when a name refers to a mount point to
// change its Permissions.
SetPermissions(perms access.Permissions, version string) error {access.Admin}
// GetPermissions returns the complete, current Permissions for an object. The
// returned version can be passed to a subsequent call to SetPermissions for
// optimistic concurrency control. A successful call to SetPermissions will
// invalidate version, and the client must call GetPermissions again to get
// the current version.
GetPermissions() (perms access.Permissions, version string | error) {access.Admin}
}