mirror of
https://github.com/datarhei/core.git
synced 2025-10-05 16:07:07 +08:00
134 lines
3.2 KiB
Go
134 lines
3.2 KiB
Go
package cluster
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
clusteriam "github.com/datarhei/core/v16/cluster/iam"
|
|
clusteriamadapter "github.com/datarhei/core/v16/cluster/iam/adapter"
|
|
"github.com/datarhei/core/v16/cluster/store"
|
|
"github.com/datarhei/core/v16/iam"
|
|
iamidentity "github.com/datarhei/core/v16/iam/identity"
|
|
iampolicy "github.com/datarhei/core/v16/iam/policy"
|
|
)
|
|
|
|
func (c *cluster) IAM(superuser iamidentity.User, jwtRealm, jwtSecret string) (iam.IAM, error) {
|
|
policyAdapter, err := clusteriamadapter.NewPolicyAdapter(c.store)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cluster policy adapter: %w", err)
|
|
}
|
|
|
|
identityAdapter, err := clusteriamadapter.NewIdentityAdapter(c.store)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cluster identitry adapter: %w", err)
|
|
}
|
|
|
|
iam, err := clusteriam.New(iam.Config{
|
|
PolicyAdapter: policyAdapter,
|
|
IdentityAdapter: identityAdapter,
|
|
Superuser: superuser,
|
|
JWTRealm: jwtRealm,
|
|
JWTSecret: jwtSecret,
|
|
Logger: c.logger.WithComponent("IAM"),
|
|
}, c.store)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("cluster iam: %w", err)
|
|
}
|
|
|
|
return iam, nil
|
|
}
|
|
|
|
func (c *cluster) ListIdentities() (time.Time, []iamidentity.User) {
|
|
users := c.store.IAMIdentityList()
|
|
|
|
return users.UpdatedAt, users.Users
|
|
}
|
|
|
|
func (c *cluster) ListIdentity(name string) (time.Time, iamidentity.User, error) {
|
|
user := c.store.IAMIdentityGet(name)
|
|
|
|
if len(user.Users) == 0 {
|
|
return time.Time{}, iamidentity.User{}, fmt.Errorf("not found")
|
|
}
|
|
|
|
return user.UpdatedAt, user.Users[0], nil
|
|
}
|
|
|
|
func (c *cluster) ListPolicies() (time.Time, []iampolicy.Policy) {
|
|
policies := c.store.IAMPolicyList()
|
|
|
|
return policies.UpdatedAt, policies.Policies
|
|
}
|
|
|
|
func (c *cluster) ListUserPolicies(name string) (time.Time, []iampolicy.Policy) {
|
|
policies := c.store.IAMIdentityPolicyList(name)
|
|
|
|
return policies.UpdatedAt, policies.Policies
|
|
}
|
|
|
|
func (c *cluster) IAMIdentityAdd(origin string, identity iamidentity.User) error {
|
|
if err := identity.Validate(); err != nil {
|
|
return fmt.Errorf("invalid identity: %w", err)
|
|
}
|
|
|
|
if !c.IsRaftLeader() {
|
|
return c.forwarder.IAMIdentityAdd(origin, identity)
|
|
}
|
|
|
|
cmd := &store.Command{
|
|
Operation: store.OpAddIdentity,
|
|
Data: &store.CommandAddIdentity{
|
|
Identity: identity,
|
|
},
|
|
}
|
|
|
|
return c.applyCommand(cmd)
|
|
}
|
|
|
|
func (c *cluster) IAMIdentityUpdate(origin, name string, identity iamidentity.User) error {
|
|
if !c.IsRaftLeader() {
|
|
return c.forwarder.IAMIdentityUpdate(origin, name, identity)
|
|
}
|
|
|
|
cmd := &store.Command{
|
|
Operation: store.OpUpdateIdentity,
|
|
Data: &store.CommandUpdateIdentity{
|
|
Name: name,
|
|
Identity: identity,
|
|
},
|
|
}
|
|
|
|
return c.applyCommand(cmd)
|
|
}
|
|
|
|
func (c *cluster) IAMPoliciesSet(origin, name string, policies []iampolicy.Policy) error {
|
|
if !c.IsRaftLeader() {
|
|
return c.forwarder.IAMPoliciesSet(origin, name, policies)
|
|
}
|
|
|
|
cmd := &store.Command{
|
|
Operation: store.OpSetPolicies,
|
|
Data: &store.CommandSetPolicies{
|
|
Name: name,
|
|
Policies: policies,
|
|
},
|
|
}
|
|
|
|
return c.applyCommand(cmd)
|
|
}
|
|
|
|
func (c *cluster) IAMIdentityRemove(origin string, name string) error {
|
|
if !c.IsRaftLeader() {
|
|
return c.forwarder.IAMIdentityRemove(origin, name)
|
|
}
|
|
|
|
cmd := &store.Command{
|
|
Operation: store.OpRemoveIdentity,
|
|
Data: &store.CommandRemoveIdentity{
|
|
Name: name,
|
|
},
|
|
}
|
|
|
|
return c.applyCommand(cmd)
|
|
}
|