149 lines
3.4 KiB
Go
149 lines
3.4 KiB
Go
package operator
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"time"
|
|
|
|
"mbase/pkg/auxuuid"
|
|
"mbase/pkg/descr"
|
|
"mbase/pkg/mbctl"
|
|
)
|
|
|
|
func (oper *Operator) SetGrant(ctx context.Context, accountID string, params *mbctl.SetGrantParams) (*mbctl.SetGrantResult, error) {
|
|
var err error
|
|
res := &mbctl.SetGrantResult{}
|
|
|
|
oper.WaitDumping()
|
|
|
|
grantExists, _, err := oper.db.GetGrant(ctx, accountID, descr.GrantModifyUsers)
|
|
if err != nil {
|
|
return res, err
|
|
}
|
|
if !grantExists {
|
|
err := fmt.Errorf("Operation not allowed for the user")
|
|
return res, err
|
|
}
|
|
|
|
grantTypes := []string{
|
|
descr.GrantModifyUsers,
|
|
descr.GrantModifyDatabase,
|
|
}
|
|
var grantOk bool
|
|
for _, grantType := range grantTypes {
|
|
if grantType == params.Grantname {
|
|
grantOk = true
|
|
break
|
|
}
|
|
}
|
|
if !grantOk {
|
|
err := fmt.Errorf("Unknown grant type")
|
|
return res, err
|
|
}
|
|
|
|
var accountDescr *descr.Account
|
|
var accountExists bool
|
|
switch {
|
|
case params.AccountID != "":
|
|
accountExists, accountDescr, err = oper.db.GetAccountByID(ctx, params.AccountID)
|
|
if err != nil {
|
|
return res, err
|
|
}
|
|
case params.Username != "":
|
|
accountExists, accountDescr, err = oper.db.GetAccountByUsername(ctx, params.Username)
|
|
if err != nil {
|
|
return res, err
|
|
}
|
|
}
|
|
if !accountExists || accountDescr == nil {
|
|
err := fmt.Errorf("Account with this id or name dont exists")
|
|
return res, err
|
|
}
|
|
|
|
grantExists, _, err = oper.db.GetGrant(ctx, accountDescr.ID, params.Grantname)
|
|
if err != nil {
|
|
return res, err
|
|
}
|
|
if grantExists {
|
|
err := fmt.Errorf("Grant %s for the user already exists", params.Grantname)
|
|
return res, err
|
|
}
|
|
now := time.Now().Format(time.RFC3339)
|
|
grantDescr := &descr.Grant{
|
|
ID: auxuuid.NewUUID(),
|
|
AccountID: accountDescr.ID,
|
|
CreatedAt: now,
|
|
Grantname: params.Grantname,
|
|
}
|
|
err = oper.db.InsertGrant(ctx, grantDescr)
|
|
if err != nil {
|
|
return res, err
|
|
}
|
|
return res, err
|
|
}
|
|
|
|
func (oper *Operator) DeleteGrant(ctx context.Context, accountID string, params *mbctl.DeleteGrantParams) (*mbctl.DeleteGrantResult, error) {
|
|
var err error
|
|
res := &mbctl.DeleteGrantResult{}
|
|
|
|
oper.WaitDumping()
|
|
|
|
grantExists, _, err := oper.db.GetGrant(ctx, accountID, descr.GrantModifyUsers)
|
|
if err != nil {
|
|
return res, err
|
|
}
|
|
if !grantExists {
|
|
err := fmt.Errorf("Operation not allowed for the user")
|
|
return res, err
|
|
}
|
|
|
|
grantTypes := []string{
|
|
descr.GrantModifyUsers,
|
|
descr.GrantModifyDatabase,
|
|
}
|
|
var grantOk bool
|
|
for _, grantType := range grantTypes {
|
|
if grantType == params.Grantname {
|
|
grantOk = true
|
|
break
|
|
}
|
|
}
|
|
if !grantOk {
|
|
err := fmt.Errorf("Unknown grant type")
|
|
return res, err
|
|
}
|
|
|
|
var accountDescr *descr.Account
|
|
var accountExists bool
|
|
switch {
|
|
case params.AccountID != "":
|
|
accountExists, accountDescr, err = oper.db.GetAccountByID(ctx, params.AccountID)
|
|
if err != nil {
|
|
return res, err
|
|
}
|
|
case params.Username != "":
|
|
accountExists, accountDescr, err = oper.db.GetAccountByUsername(ctx, params.Username)
|
|
if err != nil {
|
|
return res, err
|
|
}
|
|
}
|
|
if !accountExists || accountDescr == nil {
|
|
err := fmt.Errorf("Account with this id or name dont exists")
|
|
return res, err
|
|
}
|
|
|
|
grantExists, _, err = oper.db.GetGrant(ctx, accountDescr.ID, params.Grantname)
|
|
if err != nil {
|
|
return res, err
|
|
}
|
|
if !grantExists {
|
|
err := fmt.Errorf("Requested grant for the user not found")
|
|
return res, err
|
|
}
|
|
err = oper.db.DeleteGrantByAccountID(ctx, accountDescr.ID, params.Grantname)
|
|
if err != nil {
|
|
return res, err
|
|
}
|
|
return res, err
|
|
}
|