forked from casdoor/casdoor
139 lines
3.1 KiB
Go
139 lines
3.1 KiB
Go
package object
|
|
|
|
import (
|
|
xormadapter "github.com/casdoor/xorm-adapter/v3"
|
|
"github.com/xorm-io/xorm"
|
|
)
|
|
|
|
type SafeAdapter struct {
|
|
*xormadapter.Adapter
|
|
engine *xorm.Engine
|
|
tableName string
|
|
}
|
|
|
|
func NewSafeAdapter(a *Adapter) *SafeAdapter {
|
|
if a == nil || a.Adapter == nil || a.engine == nil {
|
|
return nil
|
|
}
|
|
|
|
return &SafeAdapter{
|
|
Adapter: a.Adapter,
|
|
engine: a.engine,
|
|
tableName: a.Table,
|
|
}
|
|
}
|
|
|
|
func (a *SafeAdapter) RemovePolicy(sec string, ptype string, rule []string) error {
|
|
line := a.buildCasbinRule(ptype, rule)
|
|
|
|
session := a.engine.NewSession()
|
|
defer session.Close()
|
|
|
|
if a.tableName != "" {
|
|
session = session.Table(a.tableName)
|
|
}
|
|
|
|
_, err := session.
|
|
MustCols("ptype", "v0", "v1", "v2", "v3", "v4", "v5").
|
|
Delete(line)
|
|
|
|
return err
|
|
}
|
|
|
|
func (a *SafeAdapter) RemovePolicies(sec string, ptype string, rules [][]string) error {
|
|
_, err := a.engine.Transaction(func(tx *xorm.Session) (interface{}, error) {
|
|
for _, rule := range rules {
|
|
line := a.buildCasbinRule(ptype, rule)
|
|
|
|
var session *xorm.Session
|
|
if a.tableName != "" {
|
|
session = tx.Table(a.tableName)
|
|
} else {
|
|
session = tx
|
|
}
|
|
|
|
_, err := session.
|
|
MustCols("ptype", "v0", "v1", "v2", "v3", "v4", "v5").
|
|
Delete(line)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return nil, nil
|
|
})
|
|
return err
|
|
}
|
|
|
|
func (a *SafeAdapter) UpdatePolicy(sec string, ptype string, oldRule []string, newRule []string) error {
|
|
oldLine := a.buildCasbinRule(ptype, oldRule)
|
|
newLine := a.buildCasbinRule(ptype, newRule)
|
|
|
|
session := a.engine.NewSession()
|
|
defer session.Close()
|
|
|
|
if a.tableName != "" {
|
|
session = session.Table(a.tableName)
|
|
}
|
|
|
|
_, err := session.
|
|
Where("ptype = ? AND v0 = ? AND v1 = ? AND v2 = ? AND v3 = ? AND v4 = ? AND v5 = ?",
|
|
oldLine.Ptype, oldLine.V0, oldLine.V1, oldLine.V2, oldLine.V3, oldLine.V4, oldLine.V5).
|
|
MustCols("ptype", "v0", "v1", "v2", "v3", "v4", "v5").
|
|
Update(newLine)
|
|
|
|
return err
|
|
}
|
|
|
|
func (a *SafeAdapter) UpdatePolicies(sec string, ptype string, oldRules [][]string, newRules [][]string) error {
|
|
_, err := a.engine.Transaction(func(tx *xorm.Session) (interface{}, error) {
|
|
for i, oldRule := range oldRules {
|
|
oldLine := a.buildCasbinRule(ptype, oldRule)
|
|
newLine := a.buildCasbinRule(ptype, newRules[i])
|
|
|
|
var session *xorm.Session
|
|
if a.tableName != "" {
|
|
session = tx.Table(a.tableName)
|
|
} else {
|
|
session = tx
|
|
}
|
|
|
|
_, err := session.
|
|
Where("ptype = ? AND v0 = ? AND v1 = ? AND v2 = ? AND v3 = ? AND v4 = ? AND v5 = ?",
|
|
oldLine.Ptype, oldLine.V0, oldLine.V1, oldLine.V2, oldLine.V3, oldLine.V4, oldLine.V5).
|
|
MustCols("ptype", "v0", "v1", "v2", "v3", "v4", "v5").
|
|
Update(newLine)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
return nil, nil
|
|
})
|
|
return err
|
|
}
|
|
|
|
func (a *SafeAdapter) buildCasbinRule(ptype string, rule []string) *xormadapter.CasbinRule {
|
|
line := xormadapter.CasbinRule{Ptype: ptype}
|
|
|
|
l := len(rule)
|
|
if l > 0 {
|
|
line.V0 = rule[0]
|
|
}
|
|
if l > 1 {
|
|
line.V1 = rule[1]
|
|
}
|
|
if l > 2 {
|
|
line.V2 = rule[2]
|
|
}
|
|
if l > 3 {
|
|
line.V3 = rule[3]
|
|
}
|
|
if l > 4 {
|
|
line.V4 = rule[4]
|
|
}
|
|
if l > 5 {
|
|
line.V5 = rule[5]
|
|
}
|
|
|
|
return &line
|
|
}
|