2023-11-07 17:20:54 +00:00
|
|
|
package engine
|
|
|
|
|
|
|
|
import (
|
|
|
|
"git.frostfs.info/TrueCloudLab/policy-engine/pkg/chain"
|
|
|
|
"git.frostfs.info/TrueCloudLab/policy-engine/pkg/resource"
|
|
|
|
)
|
|
|
|
|
2023-11-07 18:29:51 +00:00
|
|
|
type ChainRouter interface {
|
2023-11-07 17:20:54 +00:00
|
|
|
// IsAllowed returns status for the operation after all checks.
|
|
|
|
// The second return value signifies whether a matching rule was found.
|
2023-11-07 18:29:51 +00:00
|
|
|
IsAllowed(name chain.Name, target string, r resource.Request) (status chain.Status, found bool, err error)
|
|
|
|
}
|
|
|
|
|
|
|
|
// LocalOverrideStorage is the interface to manage local overrides defined
|
|
|
|
// for a node. Local overrides have a higher priority than chains got from morph storage.
|
|
|
|
type LocalOverrideStorage interface {
|
|
|
|
AddOverride(name chain.Name, resource string, c *chain.Chain) (chain.ID, error)
|
|
|
|
|
|
|
|
GetOverride(name chain.Name, resource string, chainID chain.ID) (*chain.Chain, error)
|
|
|
|
|
|
|
|
RemoveOverride(name chain.Name, resource string, chainID chain.ID) error
|
|
|
|
|
|
|
|
ListOverrides(name chain.Name, resource string) ([]*chain.Chain, error)
|
|
|
|
|
|
|
|
DropAllOverrides(name chain.Name) error
|
2023-11-07 17:20:54 +00:00
|
|
|
}
|
|
|
|
|
2023-11-07 18:29:51 +00:00
|
|
|
type TargetType rune
|
|
|
|
|
|
|
|
const (
|
|
|
|
Namespace TargetType = 'n'
|
|
|
|
Container TargetType = 'c'
|
|
|
|
)
|
|
|
|
|
|
|
|
type Target struct {
|
|
|
|
Type TargetType
|
|
|
|
Name string
|
|
|
|
}
|
|
|
|
|
|
|
|
func NamespaceTarget(namespace string) Target {
|
|
|
|
return Target{
|
|
|
|
Type: Namespace,
|
|
|
|
Name: namespace,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func ContainerTarget(container string) Target {
|
|
|
|
return Target{
|
|
|
|
Type: Container,
|
|
|
|
Name: container,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// MorphRuleChainStorage is the interface to manage chains from the chain storage.
|
|
|
|
// Basically, this implies that the storage manages rules stored in policy contract.
|
|
|
|
type MorphRuleChainStorage interface {
|
|
|
|
AddMorphRuleChain(name chain.Name, target Target, c *chain.Chain) error
|
|
|
|
|
|
|
|
RemoveMorphRuleChain(name chain.Name, target Target, chainID chain.ID) error
|
|
|
|
|
|
|
|
ListMorphRuleChains(name chain.Name, target Target) ([]*chain.Chain, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Engine is the interface that provides methods to check request permissions checking
|
|
|
|
// chain rules from morph client - this implies using the policy contract.
|
|
|
|
type Engine interface {
|
|
|
|
ChainRouter
|
|
|
|
|
|
|
|
MorphRuleChainStorage() MorphRuleChainStorage
|
|
|
|
}
|
|
|
|
|
|
|
|
// LocalOverrideEngine is extended Engine that also provides methods to manage a local
|
|
|
|
// chain rule storage. Local overrides must have the highest priority during request checking.
|
|
|
|
type LocalOverrideEngine interface {
|
2023-11-07 17:20:54 +00:00
|
|
|
Engine
|
2023-11-07 18:29:51 +00:00
|
|
|
|
|
|
|
LocalStorage() LocalOverrideStorage
|
2023-11-07 17:20:54 +00:00
|
|
|
}
|