From ea10f8e615084e7ab187047331b753e6a86de5da Mon Sep 17 00:00:00 2001 From: Yaodong Yu <2814461814@qq.com> Date: Sat, 29 Jul 2023 15:07:04 +0800 Subject: [PATCH] feat: make hard-coded authz adapter editable, rename adapter to ormer (#2149) * refactor: rename casbinAdapter to casdoorAdapter * feat: add initEnforcer * fix: router * refactor: make hard-coded code configurable * fix: data type * feat: support sqlite3 * feat: disable delete and edit name for built in resources * feat: optimize code * fix: init * fix: e2e * fix: remove datasourcename * fix: revert rename * refactor: change all ORM's Adatper to Ormer * refactor: name --- authz/authz.go | 40 +- controllers/{casbin_adapter.go => adapter.go} | 64 +- main.go | 4 +- object/adapter.go | 631 +++++++++--------- object/application.go | 20 +- object/casbin_adapter.go | 313 --------- object/cert.go | 16 +- object/chat.go | 10 +- object/enforcer.go | 54 +- object/group.go | 28 +- object/init.go | 170 ++++- object/ldap.go | 12 +- object/ldap_autosync.go | 4 +- object/ldap_conn.go | 4 +- object/message.go | 14 +- object/migrator.go | 2 +- object/migrator_1_101_0_PR_1083.go | 6 +- object/migrator_1_235_0_PR_1530.go | 2 +- object/migrator_1_240_0_PR_1539.go | 4 +- object/migrator_1_314_0_PR_1841.go | 2 +- object/model.go | 24 +- object/organization.go | 28 +- object/ormer.go | 379 +++++++++++ object/payment.go | 12 +- object/permission.go | 32 +- object/permission_enforcer.go | 6 +- object/plan.go | 10 +- object/pricing.go | 10 +- object/product.go | 10 +- object/provider.go | 20 +- object/record.go | 6 +- object/resource.go | 10 +- object/role.go | 22 +- object/session.go | 12 +- object/subscription.go | 10 +- object/syncer.go | 16 +- object/syncer_affiliation.go | 2 +- object/syncer_user.go | 12 +- object/syncer_util.go | 4 +- object/token.go | 24 +- object/user.go | 42 +- object/user_test.go | 2 +- object/user_util.go | 8 +- object/verification.go | 8 +- object/webhook.go | 12 +- routers/authz_filter.go | 2 +- routers/router.go | 34 +- swagger/swagger.json | 10 +- swagger/swagger.yml | 10 +- web/src/AdapterEditPage.js | 128 ++-- web/src/AdapterListPage.js | 3 +- web/src/EnforcerEditPage.js | 12 +- web/src/EnforcerListPage.js | 1 + web/src/ModelEditPage.js | 7 +- web/src/ModelListPage.js | 1 + web/src/Setting.js | 16 + 56 files changed, 1314 insertions(+), 1031 deletions(-) rename controllers/{casbin_adapter.go => adapter.go} (76%) delete mode 100644 object/casbin_adapter.go create mode 100644 object/ormer.go diff --git a/authz/authz.go b/authz/authz.go index aefd4b87..7110181e 100644 --- a/authz/authz.go +++ b/authz/authz.go @@ -18,56 +18,22 @@ import ( "strings" "github.com/casbin/casbin/v2" - "github.com/casbin/casbin/v2/model" "github.com/casdoor/casdoor/conf" "github.com/casdoor/casdoor/object" "github.com/casdoor/casdoor/util" - xormadapter "github.com/casdoor/xorm-adapter/v3" stringadapter "github.com/qiangmzsx/string-adapter/v2" ) var Enforcer *casbin.Enforcer -func InitAuthz() { +func InitApi() { var err error - tableNamePrefix := conf.GetConfigString("tableNamePrefix") - driverName := conf.GetConfigString("driverName") - dataSourceName := conf.GetConfigRealDataSourceName(driverName) - a, err := xormadapter.NewAdapterWithTableName(driverName, dataSourceName, "casbin_rule", tableNamePrefix, true) + e, err := object.GetEnforcer(util.GetId("built-in", "api-enforcer-built-in")) if err != nil { panic(err) } - - modelText := ` -[request_definition] -r = subOwner, subName, method, urlPath, objOwner, objName - -[policy_definition] -p = subOwner, subName, method, urlPath, objOwner, objName - -[role_definition] -g = _, _ - -[policy_effect] -e = some(where (p.eft == allow)) - -[matchers] -m = (r.subOwner == p.subOwner || p.subOwner == "*") && \ - (r.subName == p.subName || p.subName == "*" || r.subName != "anonymous" && p.subName == "!anonymous") && \ - (r.method == p.method || p.method == "*") && \ - (r.urlPath == p.urlPath || p.urlPath == "*") && \ - (r.objOwner == p.objOwner || p.objOwner == "*") && \ - (r.objName == p.objName || p.objName == "*") || \ - (r.subOwner == r.objOwner && r.subName == r.objName) -` - - m, err := model.NewModelFromString(modelText) - if err != nil { - panic(err) - } - - Enforcer, err = casbin.NewEnforcer(m, a) + Enforcer, err = e.InitEnforcer() if err != nil { panic(err) } diff --git a/controllers/casbin_adapter.go b/controllers/adapter.go similarity index 76% rename from controllers/casbin_adapter.go rename to controllers/adapter.go index 427803c3..7e255fde 100644 --- a/controllers/casbin_adapter.go +++ b/controllers/adapter.go @@ -23,14 +23,14 @@ import ( xormadapter "github.com/casdoor/xorm-adapter/v3" ) -// GetCasbinAdapters -// @Title GetCasbinAdapters +// GetAdapters +// @Title GetAdapters // @Tag Adapter API // @Description get adapters // @Param owner query string true "The owner of adapters" // @Success 200 {array} object.Adapter The Response object // @router /get-adapters [get] -func (c *ApiController) GetCasbinAdapters() { +func (c *ApiController) GetAdapters() { owner := c.Input().Get("owner") limit := c.Input().Get("pageSize") page := c.Input().Get("p") @@ -40,7 +40,7 @@ func (c *ApiController) GetCasbinAdapters() { sortOrder := c.Input().Get("sortOrder") if limit == "" || page == "" { - adapters, err := object.GetCasbinAdapters(owner) + adapters, err := object.GetAdapters(owner) if err != nil { c.ResponseError(err.Error()) return @@ -49,14 +49,14 @@ func (c *ApiController) GetCasbinAdapters() { c.ResponseOk(adapters) } else { limit := util.ParseInt(limit) - count, err := object.GetCasbinAdapterCount(owner, field, value) + count, err := object.GetAdapterCount(owner, field, value) if err != nil { c.ResponseError(err.Error()) return } paginator := pagination.SetPaginator(c.Ctx, limit, count) - adapters, err := object.GetPaginationCasbinAdapters(owner, paginator.Offset(), limit, field, value, sortField, sortOrder) + adapters, err := object.GetPaginationAdapters(owner, paginator.Offset(), limit, field, value, sortField, sortOrder) if err != nil { c.ResponseError(err.Error()) return @@ -66,17 +66,17 @@ func (c *ApiController) GetCasbinAdapters() { } } -// GetCasbinAdapter -// @Title GetCasbinAdapter +// GetAdapter +// @Title GetAdapter // @Tag Adapter API // @Description get adapter // @Param id query string true "The id ( owner/name ) of the adapter" // @Success 200 {object} object.Adapter The Response object // @router /get-adapter [get] -func (c *ApiController) GetCasbinAdapter() { +func (c *ApiController) GetAdapter() { id := c.Input().Get("id") - adapter, err := object.GetCasbinAdapter(id) + adapter, err := object.GetAdapter(id) if err != nil { c.ResponseError(err.Error()) return @@ -85,69 +85,69 @@ func (c *ApiController) GetCasbinAdapter() { c.ResponseOk(adapter) } -// UpdateCasbinAdapter -// @Title UpdateCasbinAdapter +// UpdateAdapter +// @Title UpdateAdapter // @Tag Adapter API // @Description update adapter // @Param id query string true "The id ( owner/name ) of the adapter" // @Param body body object.Adapter true "The details of the adapter" // @Success 200 {object} controllers.Response The Response object // @router /update-adapter [post] -func (c *ApiController) UpdateCasbinAdapter() { +func (c *ApiController) UpdateAdapter() { id := c.Input().Get("id") - var casbinAdapter object.CasbinAdapter - err := json.Unmarshal(c.Ctx.Input.RequestBody, &casbinAdapter) + var adapter object.Adapter + err := json.Unmarshal(c.Ctx.Input.RequestBody, &adapter) if err != nil { c.ResponseError(err.Error()) return } - c.Data["json"] = wrapActionResponse(object.UpdateCasbinAdapter(id, &casbinAdapter)) + c.Data["json"] = wrapActionResponse(object.UpdateAdapter(id, &adapter)) c.ServeJSON() } -// AddCasbinAdapter -// @Title AddCasbinAdapter +// AddAdapter +// @Title AddAdapter // @Tag Adapter API // @Description add adapter // @Param body body object.Adapter true "The details of the adapter" // @Success 200 {object} controllers.Response The Response object // @router /add-adapter [post] -func (c *ApiController) AddCasbinAdapter() { - var casbinAdapter object.CasbinAdapter - err := json.Unmarshal(c.Ctx.Input.RequestBody, &casbinAdapter) +func (c *ApiController) AddAdapter() { + var adapter object.Adapter + err := json.Unmarshal(c.Ctx.Input.RequestBody, &adapter) if err != nil { c.ResponseError(err.Error()) return } - c.Data["json"] = wrapActionResponse(object.AddCasbinAdapter(&casbinAdapter)) + c.Data["json"] = wrapActionResponse(object.AddAdapter(&adapter)) c.ServeJSON() } -// DeleteCasbinAdapter -// @Title DeleteCasbinAdapter +// DeleteAdapter +// @Title DeleteAdapter // @Tag Adapter API // @Description delete adapter // @Param body body object.Adapter true "The details of the adapter" // @Success 200 {object} controllers.Response The Response object // @router /delete-adapter [post] -func (c *ApiController) DeleteCasbinAdapter() { - var casbinAdapter object.CasbinAdapter - err := json.Unmarshal(c.Ctx.Input.RequestBody, &casbinAdapter) +func (c *ApiController) DeleteAdapter() { + var adapter object.Adapter + err := json.Unmarshal(c.Ctx.Input.RequestBody, &adapter) if err != nil { c.ResponseError(err.Error()) return } - c.Data["json"] = wrapActionResponse(object.DeleteCasbinAdapter(&casbinAdapter)) + c.Data["json"] = wrapActionResponse(object.DeleteAdapter(&adapter)) c.ServeJSON() } func (c *ApiController) SyncPolicies() { id := c.Input().Get("id") - adapter, err := object.GetCasbinAdapter(id) + adapter, err := object.GetAdapter(id) if err != nil { c.ResponseError(err.Error()) return @@ -164,7 +164,7 @@ func (c *ApiController) SyncPolicies() { func (c *ApiController) UpdatePolicy() { id := c.Input().Get("id") - adapter, err := object.GetCasbinAdapter(id) + adapter, err := object.GetAdapter(id) if err != nil { c.ResponseError(err.Error()) return @@ -188,7 +188,7 @@ func (c *ApiController) UpdatePolicy() { func (c *ApiController) AddPolicy() { id := c.Input().Get("id") - adapter, err := object.GetCasbinAdapter(id) + adapter, err := object.GetAdapter(id) if err != nil { c.ResponseError(err.Error()) return @@ -212,7 +212,7 @@ func (c *ApiController) AddPolicy() { func (c *ApiController) RemovePolicy() { id := c.Input().Get("id") - adapter, err := object.GetCasbinAdapter(id) + adapter, err := object.GetAdapter(id) if err != nil { c.ResponseError(err.Error()) return diff --git a/main.go b/main.go index 20aeda99..07bbc5a9 100644 --- a/main.go +++ b/main.go @@ -48,7 +48,7 @@ func main() { object.InitDefaultStorageProvider() object.InitLdapAutoSynchronizer() proxy.InitHttpClient() - authz.InitAuthz() + authz.InitApi() util.SafeGoroutine(func() { object.RunSyncUsersJob() }) @@ -62,7 +62,7 @@ func main() { beego.InsertFilter("*", beego.BeforeRouter, routers.StaticFilter) beego.InsertFilter("*", beego.BeforeRouter, routers.AutoSigninFilter) beego.InsertFilter("*", beego.BeforeRouter, routers.CorsFilter) - beego.InsertFilter("*", beego.BeforeRouter, routers.AuthzFilter) + beego.InsertFilter("*", beego.BeforeRouter, routers.ApiFilter) beego.InsertFilter("*", beego.BeforeRouter, routers.PrometheusFilter) beego.InsertFilter("*", beego.BeforeRouter, routers.RecordMessage) diff --git a/object/adapter.go b/object/adapter.go index a79b6f12..8cea6016 100644 --- a/object/adapter.go +++ b/object/adapter.go @@ -1,4 +1,4 @@ -// Copyright 2021 The Casdoor Authors. All Rights Reserved. +// Copyright 2022 The Casdoor Authors. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -15,365 +15,352 @@ package object import ( - "database/sql" "fmt" - "runtime" "strings" - "github.com/beego/beego" + "github.com/casbin/casbin/v2" + "github.com/casbin/casbin/v2/model" "github.com/casdoor/casdoor/conf" "github.com/casdoor/casdoor/util" xormadapter "github.com/casdoor/xorm-adapter/v3" - _ "github.com/denisenkom/go-mssqldb" // db = mssql - _ "github.com/go-sql-driver/mysql" // db = mysql - _ "github.com/lib/pq" // db = postgres "github.com/xorm-io/core" - "github.com/xorm-io/xorm" - _ "modernc.org/sqlite" // db = sqlite ) -var adapter *Adapter - -func InitConfig() { - err := beego.LoadAppConfig("ini", "../conf/app.conf") - if err != nil { - panic(err) - } - - beego.BConfig.WebConfig.Session.SessionOn = true - - InitAdapter(true) - CreateTables(true) - DoMigration() -} - -func InitAdapter(createDatabase bool) { - if createDatabase { - err := createDatabaseForPostgres(conf.GetConfigString("driverName"), conf.GetConfigDataSourceName(), conf.GetConfigString("dbName")) - if err != nil { - panic(err) - } - } - - adapter = NewAdapter(conf.GetConfigString("driverName"), conf.GetConfigDataSourceName(), conf.GetConfigString("dbName")) - - tableNamePrefix := conf.GetConfigString("tableNamePrefix") - tbMapper := core.NewPrefixMapper(core.SnakeMapper{}, tableNamePrefix) - adapter.Engine.SetTableMapper(tbMapper) -} - -func CreateTables(createDatabase bool) { - if createDatabase { - err := adapter.CreateDatabase() - if err != nil { - panic(err) - } - } - - adapter.createTable() -} - -// Adapter represents the MySQL adapter for policy storage. type Adapter struct { - driverName string - dataSourceName string - dbName string - Engine *xorm.Engine + Owner string `xorm:"varchar(100) notnull pk" json:"owner"` + Name string `xorm:"varchar(100) notnull pk" json:"name"` + CreatedTime string `xorm:"varchar(100)" json:"createdTime"` + + Type string `xorm:"varchar(100)" json:"type"` + Model string `xorm:"varchar(100)" json:"model"` + + DatabaseType string `xorm:"varchar(100)" json:"databaseType"` + Host string `xorm:"varchar(100)" json:"host"` + Port string `xorm:"varchar(20)" json:"port"` + User string `xorm:"varchar(100)" json:"user"` + Password string `xorm:"varchar(100)" json:"password"` + Database string `xorm:"varchar(100)" json:"database"` + Table string `xorm:"varchar(100)" json:"table"` + TableNamePrefix string `xorm:"varchar(100)" json:"tableNamePrefix"` + File string `xorm:"varchar(100)" json:"file"` + + IsEnabled bool `json:"isEnabled"` + + Adapter *xormadapter.Adapter `xorm:"-" json:"-"` } -// finalizer is the destructor for Adapter. -func finalizer(a *Adapter) { - err := a.Engine.Close() +func GetAdapterCount(owner, field, value string) (int64, error) { + session := GetSession(owner, -1, -1, field, value, "", "") + return session.Count(&Adapter{}) +} + +func GetAdapters(owner string) ([]*Adapter, error) { + adapters := []*Adapter{} + err := ormer.Engine.Desc("created_time").Find(&adapters, &Adapter{Owner: owner}) if err != nil { - panic(err) + return adapters, err + } + + return adapters, nil +} + +func GetPaginationAdapters(owner string, offset, limit int, field, value, sortField, sortOrder string) ([]*Adapter, error) { + adapters := []*Adapter{} + session := GetSession(owner, offset, limit, field, value, sortField, sortOrder) + err := session.Find(&adapters) + if err != nil { + return adapters, err + } + + return adapters, nil +} + +func getAdapter(owner, name string) (*Adapter, error) { + if owner == "" || name == "" { + return nil, nil + } + + adapter := Adapter{Owner: owner, Name: name} + existed, err := ormer.Engine.Get(&adapter) + if err != nil { + return nil, err + } + + if existed { + return &adapter, nil + } else { + return nil, nil } } -// NewAdapter is the constructor for Adapter. -func NewAdapter(driverName string, dataSourceName string, dbName string) *Adapter { - a := &Adapter{} - a.driverName = driverName - a.dataSourceName = dataSourceName - a.dbName = dbName - - // Open the DB, create it if not existed. - a.open() - - // Call the destructor when the object is released. - runtime.SetFinalizer(a, finalizer) - - return a +func GetAdapter(id string) (*Adapter, error) { + owner, name := util.GetOwnerAndNameFromId(id) + return getAdapter(owner, name) } -func createDatabaseForPostgres(driverName string, dataSourceName string, dbName string) error { - if driverName == "postgres" { - db, err := sql.Open(driverName, dataSourceName) - if err != nil { - return err - } - defer db.Close() +func UpdateAdapter(id string, adapter *Adapter) (bool, error) { + owner, name := util.GetOwnerAndNameFromId(id) + if adapter, err := getAdapter(owner, name); adapter == nil { + return false, err + } - _, err = db.Exec(fmt.Sprintf("CREATE DATABASE %s;", dbName)) + if name != adapter.Name { + err := adapterChangeTrigger(name, adapter.Name) if err != nil { - if !strings.Contains(err.Error(), "already exists") { - return err + return false, err + } + } + + session := ormer.Engine.ID(core.PK{owner, name}).AllCols() + if adapter.Password == "***" { + session.Omit("password") + } + affected, err := session.Update(adapter) + if err != nil { + return false, err + } + + return affected != 0, nil +} + +func AddAdapter(adapter *Adapter) (bool, error) { + affected, err := ormer.Engine.Insert(adapter) + if err != nil { + return false, err + } + + return affected != 0, nil +} + +func DeleteAdapter(adapter *Adapter) (bool, error) { + affected, err := ormer.Engine.ID(core.PK{adapter.Owner, adapter.Name}).Delete(&Adapter{}) + if err != nil { + return false, err + } + + return affected != 0, nil +} + +func (adapter *Adapter) GetId() string { + return fmt.Sprintf("%s/%s", adapter.Owner, adapter.Name) +} + +func (adapter *Adapter) getTable() string { + if adapter.DatabaseType == "mssql" { + return fmt.Sprintf("[%s]", adapter.Table) + } else { + return adapter.Table + } +} + +func initEnforcer(modelObj *Model, adapter *Adapter) (*casbin.Enforcer, error) { + // init Adapter + if adapter.Adapter == nil { + var dataSourceName string + if adapter.DatabaseType == "mssql" { + dataSourceName = fmt.Sprintf("sqlserver://%s:%s@%s:%s?database=%s", adapter.User, adapter.Password, adapter.Host, adapter.Port, adapter.Database) + } else if adapter.DatabaseType == "postgres" { + dataSourceName = fmt.Sprintf("user=%s password=%s host=%s port=%s sslmode=disable dbname=%s", adapter.User, adapter.Password, adapter.Host, adapter.Port, adapter.Database) + } else { + dataSourceName = fmt.Sprintf("%s:%s@tcp(%s:%s)/", adapter.User, adapter.Password, adapter.Host, adapter.Port) + } + + if !isCloudIntranet { + dataSourceName = strings.ReplaceAll(dataSourceName, "dbi.", "db.") + } + + var err error + adapter.Adapter, err = xormadapter.NewAdapterByEngineWithTableName(NewAdapter(adapter.DatabaseType, dataSourceName, adapter.Database).Engine, adapter.getTable(), "") + if err != nil { + return nil, err + } + } + + // init Model + m, err := model.NewModelFromString(modelObj.ModelText) + if err != nil { + return nil, err + } + + // init Enforcer + enforcer, err := casbin.NewEnforcer(m, adapter.Adapter) + if err != nil { + return nil, err + } + + return enforcer, nil +} + +func (adapter *Adapter) initAdapter() (*xormadapter.Adapter, error) { + // init Adapter + if adapter.Adapter == nil { + var dataSourceName string + + if adapter.buildInAdapter() { + dataSourceName = conf.GetConfigString("dataSourceName") + } else { + switch adapter.DatabaseType { + case "mssql": + dataSourceName = fmt.Sprintf("sqlserver://%s:%s@%s:%s?database=%s", adapter.User, + adapter.Password, adapter.Host, adapter.Port, adapter.Database) + case "mysql": + dataSourceName = fmt.Sprintf("%s:%s@tcp(%s:%s)/", adapter.User, + adapter.Password, adapter.Host, adapter.Port) + case "postgres": + dataSourceName = fmt.Sprintf("user=%s password=%s host=%s port=%s sslmode=disable dbname=%s", adapter.User, + adapter.Password, adapter.Host, adapter.Port, adapter.Database) + case "CockroachDB": + dataSourceName = fmt.Sprintf("user=%s password=%s host=%s port=%s sslmode=disable dbname=%s serial_normalization=virtual_sequence", + adapter.User, adapter.Password, adapter.Host, adapter.Port, adapter.Database) + case "sqlite3": + dataSourceName = fmt.Sprintf("file:%s", adapter.File) + default: + return nil, fmt.Errorf("unsupported database type: %s", adapter.DatabaseType) } } - return nil - } else { - return nil + if !isCloudIntranet { + dataSourceName = strings.ReplaceAll(dataSourceName, "dbi.", "db.") + } + + var err error + adapter.Adapter, err = xormadapter.NewAdapterByEngineWithTableName(NewAdapter(adapter.DatabaseType, dataSourceName, adapter.Database).Engine, adapter.getTable(), adapter.TableNamePrefix) + if err != nil { + return nil, err + } } + return adapter.Adapter, nil } -func (a *Adapter) CreateDatabase() error { - if a.driverName == "postgres" { - return nil - } +func adapterChangeTrigger(oldName string, newName string) error { + session := ormer.Engine.NewSession() + defer session.Close() - engine, err := xorm.NewEngine(a.driverName, a.dataSourceName) + err := session.Begin() if err != nil { return err } - defer engine.Close() - _, err = engine.Exec(fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s default charset utf8mb4 COLLATE utf8mb4_general_ci", a.dbName)) - return err + enforcer := new(Enforcer) + enforcer.Adapter = newName + _, err = session.Where("adapter=?", oldName).Update(enforcer) + if err != nil { + session.Rollback() + return err + } + + return session.Commit() } -func (a *Adapter) open() { - dataSourceName := a.dataSourceName + a.dbName - if a.driverName != "mysql" { - dataSourceName = a.dataSourceName - } - - engine, err := xorm.NewEngine(a.driverName, dataSourceName) - if err != nil { - panic(err) - } - - a.Engine = engine -} - -func (a *Adapter) close() { - _ = a.Engine.Close() - a.Engine = nil -} - -func (a *Adapter) createTable() { - showSql := conf.GetConfigBool("showSql") - a.Engine.ShowSQL(showSql) - - err := a.Engine.Sync2(new(Organization)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(User)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Group)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Role)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Permission)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Model)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(CasbinAdapter)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Enforcer)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Provider)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Application)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Resource)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Token)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(VerificationRecord)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Record)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Webhook)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Syncer)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Cert)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Chat)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Message)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Product)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Payment)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Ldap)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(PermissionRule)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(xormadapter.CasbinRule)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Session)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Subscription)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Plan)) - if err != nil { - panic(err) - } - - err = a.Engine.Sync2(new(Pricing)) - if err != nil { - panic(err) - } -} - -func GetSession(owner string, offset, limit int, field, value, sortField, sortOrder string) *xorm.Session { - session := adapter.Engine.Prepare() - if offset != -1 && limit != -1 { - session.Limit(limit, offset) - } - if owner != "" { - session = session.And("owner=?", owner) - } - if field != "" && value != "" { - if util.FilterField(field) { - session = session.And(fmt.Sprintf("%s like ?", util.SnakeString(field)), fmt.Sprintf("%%%s%%", value)) - } - } - if sortField == "" || sortOrder == "" { - sortField = "created_time" - } - if sortOrder == "ascend" { - session = session.Asc(util.SnakeString(sortField)) +func safeReturn(policy []string, i int) string { + if len(policy) > i { + return policy[i] } else { - session = session.Desc(util.SnakeString(sortField)) + return "" } - return session } -func GetSessionForUser(owner string, offset, limit int, field, value, sortField, sortOrder string) *xorm.Session { - session := adapter.Engine.Prepare() - if offset != -1 && limit != -1 { - session.Limit(limit, offset) - } - if owner != "" { - if offset == -1 { - session = session.And("owner=?", owner) - } else { - session = session.And("a.owner=?", owner) +func matrixToCasbinRules(Ptype string, policies [][]string) []*xormadapter.CasbinRule { + res := []*xormadapter.CasbinRule{} + + for _, policy := range policies { + line := xormadapter.CasbinRule{ + Ptype: Ptype, + V0: safeReturn(policy, 0), + V1: safeReturn(policy, 1), + V2: safeReturn(policy, 2), + V3: safeReturn(policy, 3), + V4: safeReturn(policy, 4), + V5: safeReturn(policy, 5), } - } - if field != "" && value != "" { - if util.FilterField(field) { - if offset != -1 { - field = fmt.Sprintf("a.%s", field) - } - session = session.And(fmt.Sprintf("%s like ?", util.SnakeString(field)), fmt.Sprintf("%%%s%%", value)) - } - } - if sortField == "" || sortOrder == "" { - sortField = "created_time" + res = append(res, &line) } - tableNamePrefix := conf.GetConfigString("tableNamePrefix") - tableName := tableNamePrefix + "user" - if offset == -1 { - if sortOrder == "ascend" { - session = session.Asc(util.SnakeString(sortField)) - } else { - session = session.Desc(util.SnakeString(sortField)) - } - } else { - if sortOrder == "ascend" { - session = session.Alias("a"). - Join("INNER", []string{tableName, "b"}, "a.owner = b.owner and a.name = b.name"). - Select("b.*"). - Asc("a." + util.SnakeString(sortField)) - } else { - session = session.Alias("a"). - Join("INNER", []string{tableName, "b"}, "a.owner = b.owner and a.name = b.name"). - Select("b.*"). - Desc("a." + util.SnakeString(sortField)) - } - } - - return session + return res +} + +func SyncPolicies(adapter *Adapter) ([]*xormadapter.CasbinRule, error) { + modelObj, err := getModel(adapter.Owner, adapter.Model) + if err != nil { + return nil, err + } + + if modelObj == nil { + return nil, fmt.Errorf("The model: %s does not exist", util.GetId(adapter.Owner, adapter.Model)) + } + + enforcer, err := initEnforcer(modelObj, adapter) + if err != nil { + return nil, err + } + + policies := matrixToCasbinRules("p", enforcer.GetPolicy()) + if strings.Contains(modelObj.ModelText, "[role_definition]") { + policies = append(policies, matrixToCasbinRules("g", enforcer.GetGroupingPolicy())...) + } + + return policies, nil +} + +func UpdatePolicy(oldPolicy, newPolicy []string, adapter *Adapter) (bool, error) { + modelObj, err := getModel(adapter.Owner, adapter.Model) + if err != nil { + return false, err + } + + enforcer, err := initEnforcer(modelObj, adapter) + if err != nil { + return false, err + } + + affected, err := enforcer.UpdatePolicy(oldPolicy, newPolicy) + if err != nil { + return affected, err + } + return affected, nil +} + +func AddPolicy(policy []string, adapter *Adapter) (bool, error) { + modelObj, err := getModel(adapter.Owner, adapter.Model) + if err != nil { + return false, err + } + + enforcer, err := initEnforcer(modelObj, adapter) + if err != nil { + return false, err + } + + affected, err := enforcer.AddPolicy(policy) + if err != nil { + return affected, err + } + return affected, nil +} + +func RemovePolicy(policy []string, adapter *Adapter) (bool, error) { + modelObj, err := getModel(adapter.Owner, adapter.Model) + if err != nil { + return false, err + } + + enforcer, err := initEnforcer(modelObj, adapter) + if err != nil { + return false, err + } + + affected, err := enforcer.RemovePolicy(policy) + if err != nil { + return affected, err + } + + return affected, nil +} + +func (adapter *Adapter) buildInAdapter() bool { + if adapter.Owner != "built-in" { + return false + } + + return adapter.Name == "permission-adapter-built-in" || adapter.Name == "api-adapter-built-in" } diff --git a/object/application.go b/object/application.go index 3fcb397d..1e294cf7 100644 --- a/object/application.go +++ b/object/application.go @@ -92,7 +92,7 @@ func GetOrganizationApplicationCount(owner, Organization, field, value string) ( func GetApplications(owner string) ([]*Application, error) { applications := []*Application{} - err := adapter.Engine.Desc("created_time").Find(&applications, &Application{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&applications, &Application{Owner: owner}) if err != nil { return applications, err } @@ -102,7 +102,7 @@ func GetApplications(owner string) ([]*Application, error) { func GetOrganizationApplications(owner string, organization string) ([]*Application, error) { applications := []*Application{} - err := adapter.Engine.Desc("created_time").Find(&applications, &Application{Organization: organization}) + err := ormer.Engine.Desc("created_time").Find(&applications, &Application{Organization: organization}) if err != nil { return applications, err } @@ -182,7 +182,7 @@ func getApplication(owner string, name string) (*Application, error) { } application := Application{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&application) + existed, err := ormer.Engine.Get(&application) if err != nil { return nil, err } @@ -206,7 +206,7 @@ func getApplication(owner string, name string) (*Application, error) { func GetApplicationByOrganizationName(organization string) (*Application, error) { application := Application{} - existed, err := adapter.Engine.Where("organization=?", organization).Get(&application) + existed, err := ormer.Engine.Where("organization=?", organization).Get(&application) if err != nil { return nil, nil } @@ -253,7 +253,7 @@ func GetApplicationByUserId(userId string) (application *Application, err error) func GetApplicationByClientId(clientId string) (*Application, error) { application := Application{} - existed, err := adapter.Engine.Where("client_id=?", clientId).Get(&application) + existed, err := ormer.Engine.Where("client_id=?", clientId).Get(&application) if err != nil { return nil, err } @@ -356,7 +356,7 @@ func UpdateApplication(id string, application *Application) (bool, error) { providerItem.Provider = nil } - session := adapter.Engine.ID(core.PK{owner, name}).AllCols() + session := ormer.Engine.ID(core.PK{owner, name}).AllCols() if application.ClientSecret == "***" { session.Omit("client_secret") } @@ -395,7 +395,7 @@ func AddApplication(application *Application) (bool, error) { providerItem.Provider = nil } - affected, err := adapter.Engine.Insert(application) + affected, err := ormer.Engine.Insert(application) if err != nil { return false, nil } @@ -408,7 +408,7 @@ func DeleteApplication(application *Application) (bool, error) { return false, nil } - affected, err := adapter.Engine.ID(core.PK{application.Owner, application.Name}).Delete(&Application{}) + affected, err := ormer.Engine.ID(core.PK{application.Owner, application.Name}).Delete(&Application{}) if err != nil { return false, err } @@ -484,7 +484,7 @@ func ExtendManagedAccountsWithUser(user *User) (*User, error) { } func applicationChangeTrigger(oldName string, newName string) error { - session := adapter.Engine.NewSession() + session := ormer.Engine.NewSession() defer session.Close() err := session.Begin() @@ -514,7 +514,7 @@ func applicationChangeTrigger(oldName string, newName string) error { } var permissions []*Permission - err = adapter.Engine.Find(&permissions) + err = ormer.Engine.Find(&permissions) if err != nil { return err } diff --git a/object/casbin_adapter.go b/object/casbin_adapter.go deleted file mode 100644 index 13d95058..00000000 --- a/object/casbin_adapter.go +++ /dev/null @@ -1,313 +0,0 @@ -// Copyright 2022 The Casdoor Authors. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package object - -import ( - "fmt" - "strings" - - "github.com/casbin/casbin/v2" - "github.com/casbin/casbin/v2/model" - "github.com/casdoor/casdoor/util" - xormadapter "github.com/casdoor/xorm-adapter/v3" - "github.com/xorm-io/core" -) - -type CasbinAdapter struct { - Owner string `xorm:"varchar(100) notnull pk" json:"owner"` - Name string `xorm:"varchar(100) notnull pk" json:"name"` - CreatedTime string `xorm:"varchar(100)" json:"createdTime"` - - Type string `xorm:"varchar(100)" json:"type"` - Model string `xorm:"varchar(100)" json:"model"` - - Host string `xorm:"varchar(100)" json:"host"` - Port int `json:"port"` - User string `xorm:"varchar(100)" json:"user"` - Password string `xorm:"varchar(100)" json:"password"` - DatabaseType string `xorm:"varchar(100)" json:"databaseType"` - Database string `xorm:"varchar(100)" json:"database"` - Table string `xorm:"varchar(100)" json:"table"` - IsEnabled bool `json:"isEnabled"` - - Adapter *xormadapter.Adapter `xorm:"-" json:"-"` -} - -func GetCasbinAdapterCount(owner, field, value string) (int64, error) { - session := GetSession(owner, -1, -1, field, value, "", "") - return session.Count(&CasbinAdapter{}) -} - -func GetCasbinAdapters(owner string) ([]*CasbinAdapter, error) { - adapters := []*CasbinAdapter{} - err := adapter.Engine.Desc("created_time").Find(&adapters, &CasbinAdapter{Owner: owner}) - if err != nil { - return adapters, err - } - - return adapters, nil -} - -func GetPaginationCasbinAdapters(owner string, offset, limit int, field, value, sortField, sortOrder string) ([]*CasbinAdapter, error) { - adapters := []*CasbinAdapter{} - session := GetSession(owner, offset, limit, field, value, sortField, sortOrder) - err := session.Find(&adapters) - if err != nil { - return adapters, err - } - - return adapters, nil -} - -func getCasbinAdapter(owner, name string) (*CasbinAdapter, error) { - if owner == "" || name == "" { - return nil, nil - } - - casbinAdapter := CasbinAdapter{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&casbinAdapter) - if err != nil { - return nil, err - } - - if existed { - return &casbinAdapter, nil - } else { - return nil, nil - } -} - -func GetCasbinAdapter(id string) (*CasbinAdapter, error) { - owner, name := util.GetOwnerAndNameFromId(id) - return getCasbinAdapter(owner, name) -} - -func UpdateCasbinAdapter(id string, casbinAdapter *CasbinAdapter) (bool, error) { - owner, name := util.GetOwnerAndNameFromId(id) - if casbinAdapter, err := getCasbinAdapter(owner, name); casbinAdapter == nil { - return false, err - } - - if name != casbinAdapter.Name { - err := casbinAdapterChangeTrigger(name, casbinAdapter.Name) - if err != nil { - return false, err - } - } - - session := adapter.Engine.ID(core.PK{owner, name}).AllCols() - if casbinAdapter.Password == "***" { - session.Omit("password") - } - affected, err := session.Update(casbinAdapter) - if err != nil { - return false, err - } - - return affected != 0, nil -} - -func AddCasbinAdapter(casbinAdapter *CasbinAdapter) (bool, error) { - affected, err := adapter.Engine.Insert(casbinAdapter) - if err != nil { - return false, err - } - - return affected != 0, nil -} - -func DeleteCasbinAdapter(casbinAdapter *CasbinAdapter) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{casbinAdapter.Owner, casbinAdapter.Name}).Delete(&CasbinAdapter{}) - if err != nil { - return false, err - } - - return affected != 0, nil -} - -func (casbinAdapter *CasbinAdapter) GetId() string { - return fmt.Sprintf("%s/%s", casbinAdapter.Owner, casbinAdapter.Name) -} - -func (casbinAdapter *CasbinAdapter) getTable() string { - if casbinAdapter.DatabaseType == "mssql" { - return fmt.Sprintf("[%s]", casbinAdapter.Table) - } else { - return casbinAdapter.Table - } -} - -func initEnforcer(modelObj *Model, casbinAdapter *CasbinAdapter) (*casbin.Enforcer, error) { - // init Adapter - if casbinAdapter.Adapter == nil { - var dataSourceName string - if casbinAdapter.DatabaseType == "mssql" { - dataSourceName = fmt.Sprintf("sqlserver://%s:%s@%s:%d?database=%s", casbinAdapter.User, casbinAdapter.Password, casbinAdapter.Host, casbinAdapter.Port, casbinAdapter.Database) - } else if casbinAdapter.DatabaseType == "postgres" { - dataSourceName = fmt.Sprintf("user=%s password=%s host=%s port=%d sslmode=disable dbname=%s", casbinAdapter.User, casbinAdapter.Password, casbinAdapter.Host, casbinAdapter.Port, casbinAdapter.Database) - } else { - dataSourceName = fmt.Sprintf("%s:%s@tcp(%s:%d)/", casbinAdapter.User, casbinAdapter.Password, casbinAdapter.Host, casbinAdapter.Port) - } - - if !isCloudIntranet { - dataSourceName = strings.ReplaceAll(dataSourceName, "dbi.", "db.") - } - - var err error - casbinAdapter.Adapter, err = xormadapter.NewAdapterByEngineWithTableName(NewAdapter(casbinAdapter.DatabaseType, dataSourceName, casbinAdapter.Database).Engine, casbinAdapter.getTable(), "") - if err != nil { - return nil, err - } - } - - // init Model - m, err := model.NewModelFromString(modelObj.ModelText) - if err != nil { - return nil, err - } - - // init Enforcer - enforcer, err := casbin.NewEnforcer(m, casbinAdapter.Adapter) - if err != nil { - return nil, err - } - - return enforcer, nil -} - -func casbinAdapterChangeTrigger(oldName string, newName string) error { - session := adapter.Engine.NewSession() - defer session.Close() - - err := session.Begin() - if err != nil { - return err - } - - enforcer := new(Enforcer) - enforcer.Adapter = newName - _, err = session.Where("adapter=?", oldName).Update(enforcer) - if err != nil { - session.Rollback() - return err - } - - return session.Commit() -} - -func safeReturn(policy []string, i int) string { - if len(policy) > i { - return policy[i] - } else { - return "" - } -} - -func matrixToCasbinRules(Ptype string, policies [][]string) []*xormadapter.CasbinRule { - res := []*xormadapter.CasbinRule{} - - for _, policy := range policies { - line := xormadapter.CasbinRule{ - Ptype: Ptype, - V0: safeReturn(policy, 0), - V1: safeReturn(policy, 1), - V2: safeReturn(policy, 2), - V3: safeReturn(policy, 3), - V4: safeReturn(policy, 4), - V5: safeReturn(policy, 5), - } - res = append(res, &line) - } - - return res -} - -func SyncPolicies(casbinAdapter *CasbinAdapter) ([]*xormadapter.CasbinRule, error) { - modelObj, err := getModel(casbinAdapter.Owner, casbinAdapter.Model) - if err != nil { - return nil, err - } - - if modelObj == nil { - return nil, fmt.Errorf("The model: %s does not exist", util.GetId(casbinAdapter.Owner, casbinAdapter.Model)) - } - - enforcer, err := initEnforcer(modelObj, casbinAdapter) - if err != nil { - return nil, err - } - - policies := matrixToCasbinRules("p", enforcer.GetPolicy()) - if strings.Contains(modelObj.ModelText, "[role_definition]") { - policies = append(policies, matrixToCasbinRules("g", enforcer.GetGroupingPolicy())...) - } - - return policies, nil -} - -func UpdatePolicy(oldPolicy, newPolicy []string, casbinAdapter *CasbinAdapter) (bool, error) { - modelObj, err := getModel(casbinAdapter.Owner, casbinAdapter.Model) - if err != nil { - return false, err - } - - enforcer, err := initEnforcer(modelObj, casbinAdapter) - if err != nil { - return false, err - } - - affected, err := enforcer.UpdatePolicy(oldPolicy, newPolicy) - if err != nil { - return affected, err - } - return affected, nil -} - -func AddPolicy(policy []string, casbinAdapter *CasbinAdapter) (bool, error) { - modelObj, err := getModel(casbinAdapter.Owner, casbinAdapter.Model) - if err != nil { - return false, err - } - - enforcer, err := initEnforcer(modelObj, casbinAdapter) - if err != nil { - return false, err - } - - affected, err := enforcer.AddPolicy(policy) - if err != nil { - return affected, err - } - return affected, nil -} - -func RemovePolicy(policy []string, casbinAdapter *CasbinAdapter) (bool, error) { - modelObj, err := getModel(casbinAdapter.Owner, casbinAdapter.Model) - if err != nil { - return false, err - } - - enforcer, err := initEnforcer(modelObj, casbinAdapter) - if err != nil { - return false, err - } - - affected, err := enforcer.RemovePolicy(policy) - if err != nil { - return affected, err - } - - return affected, nil -} diff --git a/object/cert.go b/object/cert.go index 697dc416..2852404d 100644 --- a/object/cert.go +++ b/object/cert.go @@ -65,7 +65,7 @@ func GetCertCount(owner, field, value string) (int64, error) { func GetCerts(owner string) ([]*Cert, error) { certs := []*Cert{} - err := adapter.Engine.Where("owner = ? or owner = ? ", "admin", owner).Desc("created_time").Find(&certs, &Cert{}) + err := ormer.Engine.Where("owner = ? or owner = ? ", "admin", owner).Desc("created_time").Find(&certs, &Cert{}) if err != nil { return certs, err } @@ -91,7 +91,7 @@ func GetGlobalCertsCount(field, value string) (int64, error) { func GetGlobleCerts() ([]*Cert, error) { certs := []*Cert{} - err := adapter.Engine.Desc("created_time").Find(&certs) + err := ormer.Engine.Desc("created_time").Find(&certs) if err != nil { return certs, err } @@ -116,7 +116,7 @@ func getCert(owner string, name string) (*Cert, error) { } cert := Cert{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&cert) + existed, err := ormer.Engine.Get(&cert) if err != nil { return &cert, err } @@ -134,7 +134,7 @@ func getCertByName(name string) (*Cert, error) { } cert := Cert{Name: name} - existed, err := adapter.Engine.Get(&cert) + existed, err := ormer.Engine.Get(&cert) if err != nil { return &cert, nil } @@ -165,7 +165,7 @@ func UpdateCert(id string, cert *Cert) (bool, error) { return false, nil } } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(cert) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(cert) if err != nil { return false, err } @@ -180,7 +180,7 @@ func AddCert(cert *Cert) (bool, error) { cert.PrivateKey = privateKey } - affected, err := adapter.Engine.Insert(cert) + affected, err := ormer.Engine.Insert(cert) if err != nil { return false, err } @@ -189,7 +189,7 @@ func AddCert(cert *Cert) (bool, error) { } func DeleteCert(cert *Cert) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{cert.Owner, cert.Name}).Delete(&Cert{}) + affected, err := ormer.Engine.ID(core.PK{cert.Owner, cert.Name}).Delete(&Cert{}) if err != nil { return false, err } @@ -214,7 +214,7 @@ func GetDefaultCert() (*Cert, error) { } func certChangeTrigger(oldName string, newName string) error { - session := adapter.Engine.NewSession() + session := ormer.Engine.NewSession() defer session.Close() err := session.Begin() diff --git a/object/chat.go b/object/chat.go index 875b0391..8b53a7f7 100644 --- a/object/chat.go +++ b/object/chat.go @@ -70,7 +70,7 @@ func GetChatCount(owner, field, value string) (int64, error) { func GetChats(owner string) ([]*Chat, error) { chats := []*Chat{} - err := adapter.Engine.Desc("created_time").Find(&chats, &Chat{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&chats, &Chat{Owner: owner}) if err != nil { return chats, err } @@ -95,7 +95,7 @@ func getChat(owner string, name string) (*Chat, error) { } chat := Chat{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&chat) + existed, err := ormer.Engine.Get(&chat) if err != nil { return &chat, err } @@ -120,7 +120,7 @@ func UpdateChat(id string, chat *Chat) (bool, error) { return false, nil } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(chat) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(chat) if err != nil { return false, nil } @@ -140,7 +140,7 @@ func AddChat(chat *Chat) (bool, error) { } } - affected, err := adapter.Engine.Insert(chat) + affected, err := ormer.Engine.Insert(chat) if err != nil { return false, nil } @@ -149,7 +149,7 @@ func AddChat(chat *Chat) (bool, error) { } func DeleteChat(chat *Chat) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{chat.Owner, chat.Name}).Delete(&Chat{}) + affected, err := ormer.Engine.ID(core.PK{chat.Owner, chat.Name}).Delete(&Chat{}) if err != nil { return false, err } diff --git a/object/enforcer.go b/object/enforcer.go index d0beb6b5..abb8ce96 100644 --- a/object/enforcer.go +++ b/object/enforcer.go @@ -15,6 +15,8 @@ package object import ( + "errors" + "github.com/casbin/casbin/v2" "github.com/casdoor/casdoor/util" "github.com/xorm-io/core" @@ -42,7 +44,7 @@ func GetEnforcerCount(owner, field, value string) (int64, error) { func GetEnforcers(owner string) ([]*Enforcer, error) { enforcers := []*Enforcer{} - err := adapter.Engine.Desc("created_time").Find(&enforcers, &Enforcer{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&enforcers, &Enforcer{Owner: owner}) if err != nil { return enforcers, err } @@ -67,7 +69,7 @@ func getEnforcer(owner string, name string) (*Enforcer, error) { } enforcer := Enforcer{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&enforcer) + existed, err := ormer.Engine.Get(&enforcer) if err != nil { return &enforcer, err } @@ -92,7 +94,7 @@ func UpdateEnforcer(id string, enforcer *Enforcer) (bool, error) { return false, nil } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(enforcer) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(enforcer) if err != nil { return false, err } @@ -101,7 +103,7 @@ func UpdateEnforcer(id string, enforcer *Enforcer) (bool, error) { } func AddEnforcer(enforcer *Enforcer) (bool, error) { - affected, err := adapter.Engine.Insert(enforcer) + affected, err := ormer.Engine.Insert(enforcer) if err != nil { return false, err } @@ -110,10 +112,52 @@ func AddEnforcer(enforcer *Enforcer) (bool, error) { } func DeleteEnforcer(enforcer *Enforcer) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{enforcer.Owner, enforcer.Name}).Delete(&Enforcer{}) + affected, err := ormer.Engine.ID(core.PK{enforcer.Owner, enforcer.Name}).Delete(&Enforcer{}) if err != nil { return false, err } return affected != 0, nil } + +func (enforcer *Enforcer) InitEnforcer() (*casbin.Enforcer, error) { + if enforcer == nil { + return nil, errors.New("enforcer is nil") + } + if enforcer.Model == "" || enforcer.Adapter == "" { + return nil, errors.New("missing model or adapter") + } + + var err error + var m *Model + var a *Adapter + + if m, err = GetModel(enforcer.Model); err != nil { + return nil, err + } else if m == nil { + return nil, errors.New("model not found") + } + + if a, err = GetAdapter(enforcer.Adapter); err != nil { + return nil, err + } else if a == nil { + return nil, errors.New("adapter not found") + } + + casbinModel, err := m.initModel() + if err != nil { + return nil, err + } + + adapter, err := a.initAdapter() + if err != nil { + return nil, err + } + + e, err := casbin.NewEnforcer(casbinModel, adapter) + if err != nil { + return nil, err + } + + return e, nil +} diff --git a/object/group.go b/object/group.go index e852f479..770ad345 100644 --- a/object/group.go +++ b/object/group.go @@ -58,7 +58,7 @@ func GetGroupCount(owner, field, value string) (int64, error) { func GetGroups(owner string) ([]*Group, error) { groups := []*Group{} - err := adapter.Engine.Desc("created_time").Find(&groups, &Group{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&groups, &Group{Owner: owner}) if err != nil { return nil, err } @@ -83,7 +83,7 @@ func getGroup(owner string, name string) (*Group, error) { } group := Group{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&group) + existed, err := ormer.Engine.Get(&group) if err != nil { return nil, err } @@ -119,7 +119,7 @@ func UpdateGroup(id string, group *Group) (bool, error) { } } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(group) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(group) if err != nil { return false, err } @@ -133,7 +133,7 @@ func AddGroup(group *Group) (bool, error) { return false, err } - affected, err := adapter.Engine.Insert(group) + affected, err := ormer.Engine.Insert(group) if err != nil { return false, err } @@ -145,7 +145,7 @@ func AddGroups(groups []*Group) (bool, error) { if len(groups) == 0 { return false, nil } - affected, err := adapter.Engine.Insert(groups) + affected, err := ormer.Engine.Insert(groups) if err != nil { return false, err } @@ -153,12 +153,12 @@ func AddGroups(groups []*Group) (bool, error) { } func DeleteGroup(group *Group) (bool, error) { - _, err := adapter.Engine.Get(group) + _, err := ormer.Engine.Get(group) if err != nil { return false, err } - if count, err := adapter.Engine.Where("parent_id = ?", group.Name).Count(&Group{}); err != nil { + if count, err := ormer.Engine.Where("parent_id = ?", group.Name).Count(&Group{}); err != nil { return false, err } else if count > 0 { return false, errors.New("group has children group") @@ -170,7 +170,7 @@ func DeleteGroup(group *Group) (bool, error) { return false, errors.New("group has users") } - affected, err := adapter.Engine.ID(core.PK{group.Owner, group.Name}).Delete(&Group{}) + affected, err := ormer.Engine.ID(core.PK{group.Owner, group.Name}).Delete(&Group{}) if err != nil { return false, err } @@ -179,7 +179,7 @@ func DeleteGroup(group *Group) (bool, error) { } func checkGroupName(name string) error { - exist, err := adapter.Engine.Exist(&Organization{Owner: "admin", Name: name}) + exist, err := ormer.Engine.Exist(&Organization{Owner: "admin", Name: name}) if err != nil { return err } @@ -233,10 +233,10 @@ func RemoveUserFromGroup(owner, name, groupName string) (bool, error) { func GetGroupUserCount(groupName string, field, value string) (int64, error) { if field == "" && value == "" { - return adapter.Engine.Where(builder.Like{"`groups`", groupName}). + return ormer.Engine.Where(builder.Like{"`groups`", groupName}). Count(&User{}) } else { - return adapter.Engine.Table("user"). + return ormer.Engine.Table("user"). Where(builder.Like{"`groups`", groupName}). And(fmt.Sprintf("user.%s LIKE ?", util.CamelToSnakeCase(field)), "%"+value+"%"). Count() @@ -245,7 +245,7 @@ func GetGroupUserCount(groupName string, field, value string) (int64, error) { func GetPaginationGroupUsers(groupName string, offset, limit int, field, value, sortField, sortOrder string) ([]*User, error) { users := []*User{} - session := adapter.Engine.Table("user"). + session := ormer.Engine.Table("user"). Where(builder.Like{"`groups`", groupName + "\""}) if offset != -1 && limit != -1 { @@ -275,7 +275,7 @@ func GetPaginationGroupUsers(groupName string, offset, limit int, field, value, func GetGroupUsers(groupName string) ([]*User, error) { users := []*User{} - err := adapter.Engine.Table("user"). + err := ormer.Engine.Table("user"). Where(builder.Like{"`groups`", groupName + "\""}). Find(&users) if err != nil { @@ -286,7 +286,7 @@ func GetGroupUsers(groupName string) ([]*User, error) { } func GroupChangeTrigger(oldName, newName string) error { - session := adapter.Engine.NewSession() + session := ormer.Engine.NewSession() defer session.Close() err := session.Begin() if err != nil { diff --git a/object/init.go b/object/init.go index e538ecd6..1f984154 100644 --- a/object/init.go +++ b/object/init.go @@ -27,7 +27,6 @@ import ( func InitDb() { existed := initBuiltInOrganization() if !existed { - initBuiltInModel() initBuiltInPermission() initBuiltInProvider() initBuiltInUser() @@ -36,6 +35,15 @@ func InitDb() { initBuiltInLdap() } + existed = initBuiltInApiModel() + if !existed { + initBuildInApiAdapter() + initBuiltInApiEnforcer() + initBuiltInPermissionModel() + initBuildInPermissionAdapter() + initBuiltInPermissionEnforcer() + } + initWebAuthn() } @@ -295,8 +303,8 @@ func initWebAuthn() { gob.Register(webauthn.SessionData{}) } -func initBuiltInModel() { - model, err := GetModel("built-in/model-built-in") +func initBuiltInPermissionModel() { + model, err := GetModel("built-in/permission-model-built-in") if err != nil { panic(err) } @@ -307,7 +315,7 @@ func initBuiltInModel() { model = &Model{ Owner: "built-in", - Name: "model-built-in", + Name: "permission-model-built-in", CreatedTime: util.GetCurrentTime(), DisplayName: "Built-in Model", IsEnabled: true, @@ -329,6 +337,54 @@ m = r.sub == p.sub && r.obj == p.obj && r.act == p.act`, } } +func initBuiltInApiModel() bool { + model, err := GetModel("built-in/api-model-built-in") + if err != nil { + panic(err) + } + + if model != nil { + return true + } + + modelText := ` +[request_definition] +r = subOwner, subName, method, urlPath, objOwner, objName + +[policy_definition] +p = subOwner, subName, method, urlPath, objOwner, objName + +[role_definition] +g = _, _ + +[policy_effect] +e = some(where (p.eft == allow)) + +[matchers] +m = (r.subOwner == p.subOwner || p.subOwner == "*") && \ + (r.subName == p.subName || p.subName == "*" || r.subName != "anonymous" && p.subName == "!anonymous") && \ + (r.method == p.method || p.method == "*") && \ + (r.urlPath == p.urlPath || p.urlPath == "*") && \ + (r.objOwner == p.objOwner || p.objOwner == "*") && \ + (r.objName == p.objName || p.objName == "*") || \ + (r.subOwner == r.objOwner && r.subName == r.objName) +` + + model = &Model{ + Owner: "built-in", + Name: "api-model-built-in", + CreatedTime: util.GetCurrentTime(), + DisplayName: "API Model", + IsEnabled: true, + ModelText: modelText, + } + _, err = AddModel(model) + if err != nil { + panic(err) + } + return false +} + func initBuiltInPermission() { permission, err := GetPermission("built-in/permission-built-in") if err != nil { @@ -358,3 +414,109 @@ func initBuiltInPermission() { panic(err) } } + +func initBuildInPermissionAdapter() { + permissionAdapter, err := GetAdapter("built-in/permission-adapter-built-in") + if err != nil { + panic(err) + } + + if permissionAdapter != nil { + return + } + + permissionAdapter = &Adapter{ + Owner: "built-in", + Name: "permission-adapter-built-in", + CreatedTime: util.GetCurrentTime(), + Type: "Database", + DatabaseType: conf.GetConfigString("driverName"), + TableNamePrefix: conf.GetConfigString("tableNamePrefix"), + Database: conf.GetConfigString("dbName"), + Table: "casbin_user_rule", + IsEnabled: true, + } + _, err = AddAdapter(permissionAdapter) + if err != nil { + panic(err) + } +} + +func initBuildInApiAdapter() { + apiAdapter, err := GetAdapter("built-in/api-adapter-built-in") + if err != nil { + panic(err) + } + + if apiAdapter != nil { + return + } + + apiAdapter = &Adapter{ + Owner: "built-in", + Name: "api-adapter-built-in", + CreatedTime: util.GetCurrentTime(), + Type: "Database", + DatabaseType: conf.GetConfigString("driverName"), + TableNamePrefix: conf.GetConfigString("tableNamePrefix"), + Database: conf.GetConfigString("dbName"), + Table: "casbin_api_rule", + IsEnabled: true, + } + _, err = AddAdapter(apiAdapter) + if err != nil { + panic(err) + } +} + +func initBuiltInPermissionEnforcer() { + permissionEnforcer, err := GetEnforcer("built-in/permission-enforcer-built-in") + if err != nil { + panic(err) + } + + if permissionEnforcer != nil { + return + } + + permissionEnforcer = &Enforcer{ + Owner: "built-in", + Name: "permission-enforcer-built-in", + CreatedTime: util.GetCurrentTime(), + DisplayName: "Permission Enforcer", + Model: "built-in/permission-model-built-in", + Adapter: "built-in/permission-adapter-built-in", + IsEnabled: true, + } + + _, err = AddEnforcer(permissionEnforcer) + if err != nil { + panic(err) + } +} + +func initBuiltInApiEnforcer() { + apiEnforcer, err := GetEnforcer("built-in/api-enforcer-built-in") + if err != nil { + panic(err) + } + + if apiEnforcer != nil { + return + } + + apiEnforcer = &Enforcer{ + Owner: "built-in", + Name: "api-enforcer-built-in", + CreatedTime: util.GetCurrentTime(), + DisplayName: "API Enforcer", + Model: "built-in/api-model-built-in", + Adapter: "built-in/api-adapter-built-in", + IsEnabled: true, + } + + _, err = AddEnforcer(apiEnforcer) + if err != nil { + panic(err) + } +} diff --git a/object/ldap.go b/object/ldap.go index 0eb4ace7..624f41e1 100644 --- a/object/ldap.go +++ b/object/ldap.go @@ -46,7 +46,7 @@ func AddLdap(ldap *Ldap) (bool, error) { ldap.CreatedTime = util.GetCurrentTime() } - affected, err := adapter.Engine.Insert(ldap) + affected, err := ormer.Engine.Insert(ldap) if err != nil { return false, err } @@ -56,7 +56,7 @@ func AddLdap(ldap *Ldap) (bool, error) { func CheckLdapExist(ldap *Ldap) (bool, error) { var result []*Ldap - err := adapter.Engine.Find(&result, &Ldap{ + err := ormer.Engine.Find(&result, &Ldap{ Owner: ldap.Owner, Host: ldap.Host, Port: ldap.Port, @@ -77,7 +77,7 @@ func CheckLdapExist(ldap *Ldap) (bool, error) { func GetLdaps(owner string) ([]*Ldap, error) { var ldaps []*Ldap - err := adapter.Engine.Desc("created_time").Find(&ldaps, &Ldap{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&ldaps, &Ldap{Owner: owner}) if err != nil { return ldaps, err } @@ -91,7 +91,7 @@ func GetLdap(id string) (*Ldap, error) { } ldap := Ldap{Id: id} - existed, err := adapter.Engine.Get(&ldap) + existed, err := ormer.Engine.Get(&ldap) if err != nil { return &ldap, nil } @@ -147,7 +147,7 @@ func UpdateLdap(ldap *Ldap) (bool, error) { ldap.Password = l.Password } - affected, err := adapter.Engine.ID(ldap.Id).Cols("owner", "server_name", "host", + affected, err := ormer.Engine.ID(ldap.Id).Cols("owner", "server_name", "host", "port", "enable_ssl", "username", "password", "base_dn", "filter", "filter_fields", "auto_sync").Update(ldap) if err != nil { return false, nil @@ -157,7 +157,7 @@ func UpdateLdap(ldap *Ldap) (bool, error) { } func DeleteLdap(ldap *Ldap) (bool, error) { - affected, err := adapter.Engine.ID(ldap.Id).Delete(&Ldap{}) + affected, err := ormer.Engine.ID(ldap.Id).Delete(&Ldap{}) if err != nil { return false, err } diff --git a/object/ldap_autosync.go b/object/ldap_autosync.go index 8e9951d5..ceac2c18 100644 --- a/object/ldap_autosync.go +++ b/object/ldap_autosync.go @@ -118,7 +118,7 @@ func (l *LdapAutoSynchronizer) syncRoutine(ldap *Ldap, stopChan chan struct{}) e // start all autosync goroutine for existing ldap servers in each organizations func (l *LdapAutoSynchronizer) LdapAutoSynchronizerStartUpAll() error { organizations := []*Organization{} - err := adapter.Engine.Desc("created_time").Find(&organizations) + err := ormer.Engine.Desc("created_time").Find(&organizations) if err != nil { logs.Info("failed to Star up LdapAutoSynchronizer; ") } @@ -141,7 +141,7 @@ func (l *LdapAutoSynchronizer) LdapAutoSynchronizerStartUpAll() error { } func UpdateLdapSyncTime(ldapId string) error { - _, err := adapter.Engine.ID(ldapId).Update(&Ldap{LastSync: util.GetCurrentTime()}) + _, err := ormer.Engine.ID(ldapId).Update(&Ldap{LastSync: util.GetCurrentTime()}) if err != nil { return err } diff --git a/object/ldap_conn.go b/object/ldap_conn.go index 219c9ac6..6dd83b21 100644 --- a/object/ldap_conn.go +++ b/object/ldap_conn.go @@ -338,7 +338,7 @@ func SyncLdapUsers(owner string, syncUsers []LdapUser, ldapId string) (existUser func GetExistUuids(owner string, uuids []string) ([]string, error) { var existUuids []string - err := adapter.Engine.Table("user").Where("owner = ?", owner).Cols("ldap"). + err := ormer.Engine.Table("user").Where("owner = ?", owner).Cols("ldap"). In("ldap", uuids).Select("DISTINCT ldap").Find(&existUuids) if err != nil { return existUuids, err @@ -350,7 +350,7 @@ func GetExistUuids(owner string, uuids []string) ([]string, error) { func (ldapUser *LdapUser) buildLdapUserName() (string, error) { user := User{} uidWithNumber := fmt.Sprintf("%s_%s", ldapUser.Uid, ldapUser.UidNumber) - has, err := adapter.Engine.Where("name = ? or name = ?", ldapUser.Uid, uidWithNumber).Get(&user) + has, err := ormer.Engine.Where("name = ? or name = ?", ldapUser.Uid, uidWithNumber).Get(&user) if err != nil { return "", err } diff --git a/object/message.go b/object/message.go index dfa84208..cef54fbe 100644 --- a/object/message.go +++ b/object/message.go @@ -55,13 +55,13 @@ func GetMessageCount(owner, organization, field, value string) (int64, error) { func GetMessages(owner string) ([]*Message, error) { messages := []*Message{} - err := adapter.Engine.Desc("created_time").Find(&messages, &Message{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&messages, &Message{Owner: owner}) return messages, err } func GetChatMessages(chat string) ([]*Message, error) { messages := []*Message{} - err := adapter.Engine.Asc("created_time").Find(&messages, &Message{Chat: chat}) + err := ormer.Engine.Asc("created_time").Find(&messages, &Message{Chat: chat}) return messages, err } @@ -78,7 +78,7 @@ func getMessage(owner string, name string) (*Message, error) { } message := Message{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&message) + existed, err := ormer.Engine.Get(&message) if err != nil { return nil, err } @@ -103,7 +103,7 @@ func UpdateMessage(id string, message *Message) (bool, error) { return false, nil } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(message) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(message) if err != nil { return false, err } @@ -112,7 +112,7 @@ func UpdateMessage(id string, message *Message) (bool, error) { } func AddMessage(message *Message) (bool, error) { - affected, err := adapter.Engine.Insert(message) + affected, err := ormer.Engine.Insert(message) if err != nil { return false, err } @@ -121,7 +121,7 @@ func AddMessage(message *Message) (bool, error) { } func DeleteMessage(message *Message) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{message.Owner, message.Name}).Delete(&Message{}) + affected, err := ormer.Engine.ID(core.PK{message.Owner, message.Name}).Delete(&Message{}) if err != nil { return false, err } @@ -130,7 +130,7 @@ func DeleteMessage(message *Message) (bool, error) { } func DeleteChatMessages(chat string) (bool, error) { - affected, err := adapter.Engine.Delete(&Message{Chat: chat}) + affected, err := ormer.Engine.Delete(&Message{Chat: chat}) if err != nil { return false, err } diff --git a/object/migrator.go b/object/migrator.go index d86aff5d..68766412 100644 --- a/object/migrator.go +++ b/object/migrator.go @@ -43,7 +43,7 @@ func DoMigration() { IDColumnName: "id", } - m := migrate.New(adapter.Engine, options, migrations) + m := migrate.New(ormer.Engine, options, migrations) err := m.Migrate() if err != nil { panic(err) diff --git a/object/migrator_1_101_0_PR_1083.go b/object/migrator_1_101_0_PR_1083.go index 53319981..a778e3c2 100644 --- a/object/migrator_1_101_0_PR_1083.go +++ b/object/migrator_1_101_0_PR_1083.go @@ -24,9 +24,9 @@ import ( type Migrator_1_101_0_PR_1083 struct{} func (*Migrator_1_101_0_PR_1083) IsMigrationNeeded() bool { - exist1, _ := adapter.Engine.IsTableExist("model") - exist2, _ := adapter.Engine.IsTableExist("permission") - exist3, _ := adapter.Engine.IsTableExist("permission_rule") + exist1, _ := ormer.Engine.IsTableExist("model") + exist2, _ := ormer.Engine.IsTableExist("permission") + exist3, _ := ormer.Engine.IsTableExist("permission_rule") if exist1 && exist2 && exist3 { return true diff --git a/object/migrator_1_235_0_PR_1530.go b/object/migrator_1_235_0_PR_1530.go index 3604e5d3..f43aef39 100644 --- a/object/migrator_1_235_0_PR_1530.go +++ b/object/migrator_1_235_0_PR_1530.go @@ -23,7 +23,7 @@ import ( type Migrator_1_235_0_PR_1530 struct{} func (*Migrator_1_235_0_PR_1530) IsMigrationNeeded() bool { - exist, _ := adapter.Engine.IsTableExist("casbin_rule") + exist, _ := ormer.Engine.IsTableExist("casbin_rule") return exist } diff --git a/object/migrator_1_240_0_PR_1539.go b/object/migrator_1_240_0_PR_1539.go index 72df8a25..c99b11c6 100644 --- a/object/migrator_1_240_0_PR_1539.go +++ b/object/migrator_1_240_0_PR_1539.go @@ -24,8 +24,8 @@ import ( type Migrator_1_240_0_PR_1539 struct{} func (*Migrator_1_240_0_PR_1539) IsMigrationNeeded() bool { - exist, _ := adapter.Engine.IsTableExist("session") - err := adapter.Engine.Table("session").Find(&[]*Session{}) + exist, _ := ormer.Engine.IsTableExist("session") + err := ormer.Engine.Table("session").Find(&[]*Session{}) if exist && err != nil { return true diff --git a/object/migrator_1_314_0_PR_1841.go b/object/migrator_1_314_0_PR_1841.go index 441f8868..75bedace 100644 --- a/object/migrator_1_314_0_PR_1841.go +++ b/object/migrator_1_314_0_PR_1841.go @@ -22,7 +22,7 @@ import ( type Migrator_1_314_0_PR_1841 struct{} func (*Migrator_1_314_0_PR_1841) IsMigrationNeeded() bool { - count, err := adapter.Engine.Where("password_type=?", "").Count(&User{}) + count, err := ormer.Engine.Where("password_type=?", "").Count(&User{}) if err != nil { // table doesn't exist return false diff --git a/object/model.go b/object/model.go index f051cb28..487366cd 100644 --- a/object/model.go +++ b/object/model.go @@ -40,7 +40,7 @@ func GetModelCount(owner, field, value string) (int64, error) { func GetModels(owner string) ([]*Model, error) { models := []*Model{} - err := adapter.Engine.Desc("created_time").Find(&models, &Model{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&models, &Model{Owner: owner}) if err != nil { return models, err } @@ -65,7 +65,7 @@ func getModel(owner string, name string) (*Model, error) { } m := Model{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&m) + existed, err := ormer.Engine.Get(&m) if err != nil { return &m, err } @@ -111,7 +111,7 @@ func UpdateModel(id string, modelObj *Model) (bool, error) { } } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(modelObj) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(modelObj) if err != nil { return false, err } @@ -120,7 +120,7 @@ func UpdateModel(id string, modelObj *Model) (bool, error) { } func AddModel(model *Model) (bool, error) { - affected, err := adapter.Engine.Insert(model) + affected, err := ormer.Engine.Insert(model) if err != nil { return false, err } @@ -129,7 +129,7 @@ func AddModel(model *Model) (bool, error) { } func DeleteModel(model *Model) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{model.Owner, model.Name}).Delete(&Model{}) + affected, err := ormer.Engine.ID(core.PK{model.Owner, model.Name}).Delete(&Model{}) if err != nil { return false, err } @@ -137,12 +137,12 @@ func DeleteModel(model *Model) (bool, error) { return affected != 0, nil } -func (model *Model) GetId() string { - return fmt.Sprintf("%s/%s", model.Owner, model.Name) +func (m *Model) GetId() string { + return fmt.Sprintf("%s/%s", m.Owner, m.Name) } func modelChangeTrigger(oldName string, newName string) error { - session := adapter.Engine.NewSession() + session := ormer.Engine.NewSession() defer session.Close() err := session.Begin() @@ -175,3 +175,11 @@ func HasRoleDefinition(m model.Model) bool { } return m["g"] != nil } + +func (m *Model) initModel() (model.Model, error) { + casbinModel, err := model.NewModelFromString(m.ModelText) + if err != nil { + return nil, err + } + return casbinModel, nil +} diff --git a/object/organization.go b/object/organization.go index 9384326e..c1840757 100644 --- a/object/organization.go +++ b/object/organization.go @@ -80,12 +80,12 @@ func GetOrganizationCount(owner, field, value string) (int64, error) { func GetOrganizations(owner string, name ...string) ([]*Organization, error) { organizations := []*Organization{} if name != nil && len(name) > 0 { - err := adapter.Engine.Desc("created_time").Where(builder.In("name", name)).Find(&organizations) + err := ormer.Engine.Desc("created_time").Where(builder.In("name", name)).Find(&organizations) if err != nil { return nil, err } } else { - err := adapter.Engine.Desc("created_time").Find(&organizations, &Organization{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&organizations, &Organization{Owner: owner}) if err != nil { return nil, err } @@ -96,7 +96,7 @@ func GetOrganizations(owner string, name ...string) ([]*Organization, error) { func GetOrganizationsByFields(owner string, fields ...string) ([]*Organization, error) { organizations := []*Organization{} - err := adapter.Engine.Desc("created_time").Cols(fields...).Find(&organizations, &Organization{Owner: owner}) + err := ormer.Engine.Desc("created_time").Cols(fields...).Find(&organizations, &Organization{Owner: owner}) if err != nil { return nil, err } @@ -126,7 +126,7 @@ func getOrganization(owner string, name string) (*Organization, error) { } organization := Organization{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&organization) + existed, err := ormer.Engine.Get(&organization) if err != nil { return nil, err } @@ -201,7 +201,7 @@ func UpdateOrganization(id string, organization *Organization) (bool, error) { } } - session := adapter.Engine.ID(core.PK{owner, name}).AllCols() + session := ormer.Engine.ID(core.PK{owner, name}).AllCols() if organization.MasterPassword == "***" { session.Omit("master_password") } @@ -214,7 +214,7 @@ func UpdateOrganization(id string, organization *Organization) (bool, error) { } func AddOrganization(organization *Organization) (bool, error) { - affected, err := adapter.Engine.Insert(organization) + affected, err := ormer.Engine.Insert(organization) if err != nil { return false, err } @@ -227,7 +227,7 @@ func DeleteOrganization(organization *Organization) (bool, error) { return false, nil } - affected, err := adapter.Engine.ID(core.PK{organization.Owner, organization.Name}).Delete(&Organization{}) + affected, err := ormer.Engine.ID(core.PK{organization.Owner, organization.Name}).Delete(&Organization{}) if err != nil { return false, err } @@ -299,7 +299,7 @@ func GetDefaultApplication(id string) (*Application, error) { } applications := []*Application{} - err = adapter.Engine.Asc("created_time").Find(&applications, &Application{Organization: organization.Name}) + err = ormer.Engine.Asc("created_time").Find(&applications, &Application{Organization: organization.Name}) if err != nil { return nil, err } @@ -330,7 +330,7 @@ func GetDefaultApplication(id string) (*Application, error) { } func organizationChangeTrigger(oldName string, newName string) error { - session := adapter.Engine.NewSession() + session := ormer.Engine.NewSession() defer session.Close() err := session.Begin() @@ -360,7 +360,7 @@ func organizationChangeTrigger(oldName string, newName string) error { } role := new(Role) - _, err = adapter.Engine.Where("owner=?", oldName).Get(role) + _, err = ormer.Engine.Where("owner=?", oldName).Get(role) if err != nil { return err } @@ -385,7 +385,7 @@ func organizationChangeTrigger(oldName string, newName string) error { } permission := new(Permission) - _, err = adapter.Engine.Where("owner=?", oldName).Get(permission) + _, err = ormer.Engine.Where("owner=?", oldName).Get(permission) if err != nil { return err } @@ -409,9 +409,9 @@ func organizationChangeTrigger(oldName string, newName string) error { return err } - casbinAdapter := new(CasbinAdapter) - casbinAdapter.Owner = newName - _, err = session.Where("owner=?", oldName).Update(casbinAdapter) + adapter := new(Adapter) + adapter.Owner = newName + _, err = session.Where("owner=?", oldName).Update(adapter) if err != nil { return err } diff --git a/object/ormer.go b/object/ormer.go new file mode 100644 index 00000000..8ecf78ed --- /dev/null +++ b/object/ormer.go @@ -0,0 +1,379 @@ +// Copyright 2021 The Casdoor Authors. All Rights Reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package object + +import ( + "database/sql" + "fmt" + "runtime" + "strings" + + "github.com/beego/beego" + "github.com/casdoor/casdoor/conf" + "github.com/casdoor/casdoor/util" + xormadapter "github.com/casdoor/xorm-adapter/v3" + _ "github.com/denisenkom/go-mssqldb" // db = mssql + _ "github.com/go-sql-driver/mysql" // db = mysql + _ "github.com/lib/pq" // db = postgres + "github.com/xorm-io/core" + "github.com/xorm-io/xorm" + _ "modernc.org/sqlite" // db = sqlite +) + +var ormer *Ormer + +func InitConfig() { + err := beego.LoadAppConfig("ini", "../conf/app.conf") + if err != nil { + panic(err) + } + + beego.BConfig.WebConfig.Session.SessionOn = true + + InitAdapter(true) + CreateTables(true) + DoMigration() +} + +func InitAdapter(createDatabase bool) { + if createDatabase { + err := createDatabaseForPostgres(conf.GetConfigString("driverName"), conf.GetConfigDataSourceName(), conf.GetConfigString("dbName")) + if err != nil { + panic(err) + } + } + + ormer = NewAdapter(conf.GetConfigString("driverName"), conf.GetConfigDataSourceName(), conf.GetConfigString("dbName")) + + tableNamePrefix := conf.GetConfigString("tableNamePrefix") + tbMapper := core.NewPrefixMapper(core.SnakeMapper{}, tableNamePrefix) + ormer.Engine.SetTableMapper(tbMapper) +} + +func CreateTables(createDatabase bool) { + if createDatabase { + err := ormer.CreateDatabase() + if err != nil { + panic(err) + } + } + + ormer.createTable() +} + +// Ormer represents the MySQL adapter for policy storage. +type Ormer struct { + driverName string + dataSourceName string + dbName string + Engine *xorm.Engine +} + +// finalizer is the destructor for Ormer. +func finalizer(a *Ormer) { + err := a.Engine.Close() + if err != nil { + panic(err) + } +} + +// NewAdapter is the constructor for Ormer. +func NewAdapter(driverName string, dataSourceName string, dbName string) *Ormer { + a := &Ormer{} + a.driverName = driverName + a.dataSourceName = dataSourceName + a.dbName = dbName + + // Open the DB, create it if not existed. + a.open() + + // Call the destructor when the object is released. + runtime.SetFinalizer(a, finalizer) + + return a +} + +func createDatabaseForPostgres(driverName string, dataSourceName string, dbName string) error { + if driverName == "postgres" { + db, err := sql.Open(driverName, dataSourceName) + if err != nil { + return err + } + defer db.Close() + + _, err = db.Exec(fmt.Sprintf("CREATE DATABASE %s;", dbName)) + if err != nil { + if !strings.Contains(err.Error(), "already exists") { + return err + } + } + + return nil + } else { + return nil + } +} + +func (a *Ormer) CreateDatabase() error { + if a.driverName == "postgres" { + return nil + } + + engine, err := xorm.NewEngine(a.driverName, a.dataSourceName) + if err != nil { + return err + } + defer engine.Close() + + _, err = engine.Exec(fmt.Sprintf("CREATE DATABASE IF NOT EXISTS %s default charset utf8mb4 COLLATE utf8mb4_general_ci", a.dbName)) + return err +} + +func (a *Ormer) open() { + dataSourceName := a.dataSourceName + a.dbName + if a.driverName != "mysql" { + dataSourceName = a.dataSourceName + } + + engine, err := xorm.NewEngine(a.driverName, dataSourceName) + if err != nil { + panic(err) + } + + a.Engine = engine +} + +func (a *Ormer) close() { + _ = a.Engine.Close() + a.Engine = nil +} + +func (a *Ormer) createTable() { + showSql := conf.GetConfigBool("showSql") + a.Engine.ShowSQL(showSql) + + err := a.Engine.Sync2(new(Organization)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(User)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Group)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Role)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Permission)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Model)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Adapter)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Enforcer)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Provider)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Application)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Resource)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Token)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(VerificationRecord)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Record)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Webhook)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Syncer)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Cert)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Chat)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Message)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Product)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Payment)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Ldap)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(PermissionRule)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(xormadapter.CasbinRule)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Session)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Subscription)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Plan)) + if err != nil { + panic(err) + } + + err = a.Engine.Sync2(new(Pricing)) + if err != nil { + panic(err) + } +} + +func GetSession(owner string, offset, limit int, field, value, sortField, sortOrder string) *xorm.Session { + session := ormer.Engine.Prepare() + if offset != -1 && limit != -1 { + session.Limit(limit, offset) + } + if owner != "" { + session = session.And("owner=?", owner) + } + if field != "" && value != "" { + if util.FilterField(field) { + session = session.And(fmt.Sprintf("%s like ?", util.SnakeString(field)), fmt.Sprintf("%%%s%%", value)) + } + } + if sortField == "" || sortOrder == "" { + sortField = "created_time" + } + if sortOrder == "ascend" { + session = session.Asc(util.SnakeString(sortField)) + } else { + session = session.Desc(util.SnakeString(sortField)) + } + return session +} + +func GetSessionForUser(owner string, offset, limit int, field, value, sortField, sortOrder string) *xorm.Session { + session := ormer.Engine.Prepare() + if offset != -1 && limit != -1 { + session.Limit(limit, offset) + } + if owner != "" { + if offset == -1 { + session = session.And("owner=?", owner) + } else { + session = session.And("a.owner=?", owner) + } + } + if field != "" && value != "" { + if util.FilterField(field) { + if offset != -1 { + field = fmt.Sprintf("a.%s", field) + } + session = session.And(fmt.Sprintf("%s like ?", util.SnakeString(field)), fmt.Sprintf("%%%s%%", value)) + } + } + if sortField == "" || sortOrder == "" { + sortField = "created_time" + } + + tableNamePrefix := conf.GetConfigString("tableNamePrefix") + tableName := tableNamePrefix + "user" + if offset == -1 { + if sortOrder == "ascend" { + session = session.Asc(util.SnakeString(sortField)) + } else { + session = session.Desc(util.SnakeString(sortField)) + } + } else { + if sortOrder == "ascend" { + session = session.Alias("a"). + Join("INNER", []string{tableName, "b"}, "a.owner = b.owner and a.name = b.name"). + Select("b.*"). + Asc("a." + util.SnakeString(sortField)) + } else { + session = session.Alias("a"). + Join("INNER", []string{tableName, "b"}, "a.owner = b.owner and a.name = b.name"). + Select("b.*"). + Desc("a." + util.SnakeString(sortField)) + } + } + + return session +} diff --git a/object/payment.go b/object/payment.go index c16c36dd..9a261eed 100644 --- a/object/payment.go +++ b/object/payment.go @@ -63,7 +63,7 @@ func GetPaymentCount(owner, organization, field, value string) (int64, error) { func GetPayments(owner string) ([]*Payment, error) { payments := []*Payment{} - err := adapter.Engine.Desc("created_time").Find(&payments, &Payment{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&payments, &Payment{Owner: owner}) if err != nil { return nil, err } @@ -73,7 +73,7 @@ func GetPayments(owner string) ([]*Payment, error) { func GetUserPayments(owner string, organization string, user string) ([]*Payment, error) { payments := []*Payment{} - err := adapter.Engine.Desc("created_time").Find(&payments, &Payment{Owner: owner, Organization: organization, User: user}) + err := ormer.Engine.Desc("created_time").Find(&payments, &Payment{Owner: owner, Organization: organization, User: user}) if err != nil { return nil, err } @@ -98,7 +98,7 @@ func getPayment(owner string, name string) (*Payment, error) { } payment := Payment{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&payment) + existed, err := ormer.Engine.Get(&payment) if err != nil { return nil, err } @@ -123,7 +123,7 @@ func UpdatePayment(id string, payment *Payment) (bool, error) { return false, nil } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(payment) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(payment) if err != nil { panic(err) } @@ -132,7 +132,7 @@ func UpdatePayment(id string, payment *Payment) (bool, error) { } func AddPayment(payment *Payment) (bool, error) { - affected, err := adapter.Engine.Insert(payment) + affected, err := ormer.Engine.Insert(payment) if err != nil { return false, err } @@ -141,7 +141,7 @@ func AddPayment(payment *Payment) (bool, error) { } func DeletePayment(payment *Payment) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{payment.Owner, payment.Name}).Delete(&Payment{}) + affected, err := ormer.Engine.ID(core.PK{payment.Owner, payment.Name}).Delete(&Payment{}) if err != nil { return false, err } diff --git a/object/permission.go b/object/permission.go index 514c3f09..2a149179 100644 --- a/object/permission.go +++ b/object/permission.go @@ -74,7 +74,7 @@ func GetPermissionCount(owner, field, value string) (int64, error) { func GetPermissions(owner string) ([]*Permission, error) { permissions := []*Permission{} - err := adapter.Engine.Desc("created_time").Find(&permissions, &Permission{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&permissions, &Permission{Owner: owner}) if err != nil { return permissions, err } @@ -99,7 +99,7 @@ func getPermission(owner string, name string) (*Permission, error) { } permission := Permission{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&permission) + existed, err := ormer.Engine.Get(&permission) if err != nil { return &permission, err } @@ -155,7 +155,7 @@ func UpdatePermission(id string, permission *Permission) (bool, error) { return false, nil } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(permission) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(permission) if err != nil { return false, err } @@ -164,9 +164,9 @@ func UpdatePermission(id string, permission *Permission) (bool, error) { removeGroupingPolicies(oldPermission) removePolicies(oldPermission) if oldPermission.Adapter != "" && oldPermission.Adapter != permission.Adapter { - isEmpty, _ := adapter.Engine.IsTableEmpty(oldPermission.Adapter) + isEmpty, _ := ormer.Engine.IsTableEmpty(oldPermission.Adapter) if isEmpty { - err = adapter.Engine.DropTables(oldPermission.Adapter) + err = ormer.Engine.DropTables(oldPermission.Adapter) if err != nil { return false, err } @@ -180,7 +180,7 @@ func UpdatePermission(id string, permission *Permission) (bool, error) { } func AddPermission(permission *Permission) (bool, error) { - affected, err := adapter.Engine.Insert(permission) + affected, err := ormer.Engine.Insert(permission) if err != nil { return false, err } @@ -198,7 +198,7 @@ func AddPermissions(permissions []*Permission) bool { return false } - affected, err := adapter.Engine.Insert(permissions) + affected, err := ormer.Engine.Insert(permissions) if err != nil { if !strings.Contains(err.Error(), "Duplicate entry") { panic(err) @@ -242,7 +242,7 @@ func AddPermissionsInBatch(permissions []*Permission) bool { } func DeletePermission(permission *Permission) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{permission.Owner, permission.Name}).Delete(&Permission{}) + affected, err := ormer.Engine.ID(core.PK{permission.Owner, permission.Name}).Delete(&Permission{}) if err != nil { return false, err } @@ -251,9 +251,9 @@ func DeletePermission(permission *Permission) (bool, error) { removeGroupingPolicies(permission) removePolicies(permission) if permission.Adapter != "" && permission.Adapter != "permission_rule" { - isEmpty, _ := adapter.Engine.IsTableEmpty(permission.Adapter) + isEmpty, _ := ormer.Engine.IsTableEmpty(permission.Adapter) if isEmpty { - err = adapter.Engine.DropTables(permission.Adapter) + err = ormer.Engine.DropTables(permission.Adapter) if err != nil { return false, err } @@ -266,7 +266,7 @@ func DeletePermission(permission *Permission) (bool, error) { func GetPermissionsAndRolesByUser(userId string) ([]*Permission, []*Role, error) { permissions := []*Permission{} - err := adapter.Engine.Where("users like ?", "%"+userId+"\"%").Find(&permissions) + err := ormer.Engine.Where("users like ?", "%"+userId+"\"%").Find(&permissions) if err != nil { return nil, nil, err } @@ -290,7 +290,7 @@ func GetPermissionsAndRolesByUser(userId string) ([]*Permission, []*Role, error) for _, role := range roles { perms := []*Permission{} - err := adapter.Engine.Where("roles like ?", "%"+role.Name+"\"%").Find(&perms) + err := ormer.Engine.Where("roles like ?", "%"+role.Name+"\"%").Find(&perms) if err != nil { return nil, nil, err } @@ -310,7 +310,7 @@ func GetPermissionsAndRolesByUser(userId string) ([]*Permission, []*Role, error) func GetPermissionsByRole(roleId string) ([]*Permission, error) { permissions := []*Permission{} - err := adapter.Engine.Where("roles like ?", "%"+roleId+"\"%").Find(&permissions) + err := ormer.Engine.Where("roles like ?", "%"+roleId+"\"%").Find(&permissions) if err != nil { return permissions, err } @@ -320,7 +320,7 @@ func GetPermissionsByRole(roleId string) ([]*Permission, error) { func GetPermissionsByResource(resourceId string) ([]*Permission, error) { permissions := []*Permission{} - err := adapter.Engine.Where("resources like ?", "%"+resourceId+"\"%").Find(&permissions) + err := ormer.Engine.Where("resources like ?", "%"+resourceId+"\"%").Find(&permissions) if err != nil { return permissions, err } @@ -330,7 +330,7 @@ func GetPermissionsByResource(resourceId string) ([]*Permission, error) { func GetPermissionsBySubmitter(owner string, submitter string) ([]*Permission, error) { permissions := []*Permission{} - err := adapter.Engine.Desc("created_time").Find(&permissions, &Permission{Owner: owner, Submitter: submitter}) + err := ormer.Engine.Desc("created_time").Find(&permissions, &Permission{Owner: owner, Submitter: submitter}) if err != nil { return permissions, err } @@ -340,7 +340,7 @@ func GetPermissionsBySubmitter(owner string, submitter string) ([]*Permission, e func GetPermissionsByModel(owner string, model string) ([]*Permission, error) { permissions := []*Permission{} - err := adapter.Engine.Desc("created_time").Find(&permissions, &Permission{Owner: owner, Model: model}) + err := ormer.Engine.Desc("created_time").Find(&permissions, &Permission{Owner: owner, Model: model}) if err != nil { return permissions, err } diff --git a/object/permission_enforcer.go b/object/permission_enforcer.go index 998e36a7..c2b686b5 100644 --- a/object/permission_enforcer.go +++ b/object/permission_enforcer.go @@ -69,7 +69,7 @@ func getPermissionEnforcer(p *Permission, permissionIDs ...string) *casbin.Enfor func (p *Permission) setEnforcerAdapter(enforcer *casbin.Enforcer) error { tableName := "permission_rule" if len(p.Adapter) != 0 { - adapterObj, err := getCasbinAdapter(p.Owner, p.Adapter) + adapterObj, err := getAdapter(p.Owner, p.Adapter) if err != nil { return err } @@ -81,12 +81,12 @@ func (p *Permission) setEnforcerAdapter(enforcer *casbin.Enforcer) error { tableNamePrefix := conf.GetConfigString("tableNamePrefix") driverName := conf.GetConfigString("driverName") dataSourceName := conf.GetConfigRealDataSourceName(driverName) - casbinAdapter, err := xormadapter.NewAdapterWithTableName(driverName, dataSourceName, tableName, tableNamePrefix, true) + adapter, err := xormadapter.NewAdapterWithTableName(driverName, dataSourceName, tableName, tableNamePrefix, true) if err != nil { return err } - enforcer.SetAdapter(casbinAdapter) + enforcer.SetAdapter(adapter) return nil } diff --git a/object/plan.go b/object/plan.go index 48d482cf..f2e0cf6b 100644 --- a/object/plan.go +++ b/object/plan.go @@ -44,7 +44,7 @@ func GetPlanCount(owner, field, value string) (int64, error) { func GetPlans(owner string) ([]*Plan, error) { plans := []*Plan{} - err := adapter.Engine.Desc("created_time").Find(&plans, &Plan{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&plans, &Plan{Owner: owner}) if err != nil { return plans, err } @@ -67,7 +67,7 @@ func getPlan(owner, name string) (*Plan, error) { } plan := Plan{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&plan) + existed, err := ormer.Engine.Get(&plan) if err != nil { return &plan, err } @@ -91,7 +91,7 @@ func UpdatePlan(id string, plan *Plan) (bool, error) { return false, nil } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(plan) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(plan) if err != nil { return false, err } @@ -100,7 +100,7 @@ func UpdatePlan(id string, plan *Plan) (bool, error) { } func AddPlan(plan *Plan) (bool, error) { - affected, err := adapter.Engine.Insert(plan) + affected, err := ormer.Engine.Insert(plan) if err != nil { return false, err } @@ -108,7 +108,7 @@ func AddPlan(plan *Plan) (bool, error) { } func DeletePlan(plan *Plan) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{plan.Owner, plan.Name}).Delete(plan) + affected, err := ormer.Engine.ID(core.PK{plan.Owner, plan.Name}).Delete(plan) if err != nil { return false, err } diff --git a/object/pricing.go b/object/pricing.go index ffeb7213..8d81f424 100644 --- a/object/pricing.go +++ b/object/pricing.go @@ -48,7 +48,7 @@ func GetPricingCount(owner, field, value string) (int64, error) { func GetPricings(owner string) ([]*Pricing, error) { pricings := []*Pricing{} - err := adapter.Engine.Desc("created_time").Find(&pricings, &Pricing{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&pricings, &Pricing{Owner: owner}) if err != nil { return pricings, err } @@ -72,7 +72,7 @@ func getPricing(owner, name string) (*Pricing, error) { } pricing := Pricing{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&pricing) + existed, err := ormer.Engine.Get(&pricing) if err != nil { return &pricing, err } @@ -96,7 +96,7 @@ func UpdatePricing(id string, pricing *Pricing) (bool, error) { return false, nil } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(pricing) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(pricing) if err != nil { return false, err } @@ -105,7 +105,7 @@ func UpdatePricing(id string, pricing *Pricing) (bool, error) { } func AddPricing(pricing *Pricing) (bool, error) { - affected, err := adapter.Engine.Insert(pricing) + affected, err := ormer.Engine.Insert(pricing) if err != nil { return false, err } @@ -113,7 +113,7 @@ func AddPricing(pricing *Pricing) (bool, error) { } func DeletePricing(pricing *Pricing) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{pricing.Owner, pricing.Name}).Delete(pricing) + affected, err := ormer.Engine.ID(core.PK{pricing.Owner, pricing.Name}).Delete(pricing) if err != nil { return false, err } diff --git a/object/product.go b/object/product.go index 4a29bb49..cc77d124 100644 --- a/object/product.go +++ b/object/product.go @@ -50,7 +50,7 @@ func GetProductCount(owner, field, value string) (int64, error) { func GetProducts(owner string) ([]*Product, error) { products := []*Product{} - err := adapter.Engine.Desc("created_time").Find(&products, &Product{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&products, &Product{Owner: owner}) if err != nil { return products, err } @@ -75,7 +75,7 @@ func getProduct(owner string, name string) (*Product, error) { } product := Product{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&product) + existed, err := ormer.Engine.Get(&product) if err != nil { return &product, nil } @@ -100,7 +100,7 @@ func UpdateProduct(id string, product *Product) (bool, error) { return false, nil } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(product) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(product) if err != nil { return false, err } @@ -109,7 +109,7 @@ func UpdateProduct(id string, product *Product) (bool, error) { } func AddProduct(product *Product) (bool, error) { - affected, err := adapter.Engine.Insert(product) + affected, err := ormer.Engine.Insert(product) if err != nil { return false, err } @@ -118,7 +118,7 @@ func AddProduct(product *Product) (bool, error) { } func DeleteProduct(product *Product) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{product.Owner, product.Name}).Delete(&Product{}) + affected, err := ormer.Engine.ID(core.PK{product.Owner, product.Name}).Delete(&Product{}) if err != nil { return false, err } diff --git a/object/provider.go b/object/provider.go index 9a53cb3a..cf04fbcf 100644 --- a/object/provider.go +++ b/object/provider.go @@ -119,7 +119,7 @@ func GetGlobalProviderCount(field, value string) (int64, error) { func GetProviders(owner string) ([]*Provider, error) { providers := []*Provider{} - err := adapter.Engine.Where("owner = ? or owner = ? ", "admin", owner).Desc("created_time").Find(&providers, &Provider{}) + err := ormer.Engine.Where("owner = ? or owner = ? ", "admin", owner).Desc("created_time").Find(&providers, &Provider{}) if err != nil { return providers, err } @@ -129,7 +129,7 @@ func GetProviders(owner string) ([]*Provider, error) { func GetGlobalProviders() ([]*Provider, error) { providers := []*Provider{} - err := adapter.Engine.Desc("created_time").Find(&providers) + err := ormer.Engine.Desc("created_time").Find(&providers) if err != nil { return providers, err } @@ -165,7 +165,7 @@ func getProvider(owner string, name string) (*Provider, error) { } provider := Provider{Name: name} - existed, err := adapter.Engine.Get(&provider) + existed, err := ormer.Engine.Get(&provider) if err != nil { return &provider, err } @@ -184,7 +184,7 @@ func GetProvider(id string) (*Provider, error) { func getDefaultAiProvider() (*Provider, error) { provider := Provider{Owner: "admin", Category: "AI"} - existed, err := adapter.Engine.Get(&provider) + existed, err := ormer.Engine.Get(&provider) if err != nil { return &provider, err } @@ -221,7 +221,7 @@ func UpdateProvider(id string, provider *Provider) (bool, error) { } } - session := adapter.Engine.ID(core.PK{owner, name}).AllCols() + session := ormer.Engine.ID(core.PK{owner, name}).AllCols() if provider.ClientSecret == "***" { session = session.Omit("client_secret") } @@ -248,7 +248,7 @@ func AddProvider(provider *Provider) (bool, error) { provider.IntranetEndpoint = util.GetEndPoint(provider.IntranetEndpoint) } - affected, err := adapter.Engine.Insert(provider) + affected, err := ormer.Engine.Insert(provider) if err != nil { return false, err } @@ -257,7 +257,7 @@ func AddProvider(provider *Provider) (bool, error) { } func DeleteProvider(provider *Provider) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{provider.Owner, provider.Name}).Delete(&Provider{}) + affected, err := ormer.Engine.ID(core.PK{provider.Owner, provider.Name}).Delete(&Provider{}) if err != nil { return false, err } @@ -297,7 +297,7 @@ func (p *Provider) GetId() string { func GetCaptchaProviderByOwnerName(applicationId, lang string) (*Provider, error) { owner, name := util.GetOwnerAndNameFromId(applicationId) provider := Provider{Owner: owner, Name: name, Category: "Captcha"} - existed, err := adapter.Engine.Get(&provider) + existed, err := ormer.Engine.Get(&provider) if err != nil { return nil, err } @@ -333,7 +333,7 @@ func GetCaptchaProviderByApplication(applicationId, isCurrentProvider, lang stri } func providerChangeTrigger(oldName string, newName string) error { - session := adapter.Engine.NewSession() + session := ormer.Engine.NewSession() defer session.Close() err := session.Begin() @@ -342,7 +342,7 @@ func providerChangeTrigger(oldName string, newName string) error { } var applications []*Application - err = adapter.Engine.Find(&applications) + err = ormer.Engine.Find(&applications) if err != nil { return err } diff --git a/object/record.go b/object/record.go index 7a71ef19..c2c20f41 100644 --- a/object/record.go +++ b/object/record.go @@ -96,7 +96,7 @@ func AddRecord(record *Record) bool { fmt.Println(errWebhook) } - affected, err := adapter.Engine.Insert(record) + affected, err := ormer.Engine.Insert(record) if err != nil { panic(err) } @@ -111,7 +111,7 @@ func GetRecordCount(field, value string, filterRecord *Record) (int64, error) { func GetRecords() ([]*Record, error) { records := []*Record{} - err := adapter.Engine.Desc("id").Find(&records) + err := ormer.Engine.Desc("id").Find(&records) if err != nil { return records, err } @@ -132,7 +132,7 @@ func GetPaginationRecords(offset, limit int, field, value, sortField, sortOrder func GetRecordsByField(record *Record) ([]*Record, error) { records := []*Record{} - err := adapter.Engine.Find(&records, record) + err := ormer.Engine.Find(&records, record) if err != nil { return records, err } diff --git a/object/resource.go b/object/resource.go index 603e5277..bb66aa22 100644 --- a/object/resource.go +++ b/object/resource.go @@ -52,7 +52,7 @@ func GetResources(owner string, user string) ([]*Resource, error) { } resources := []*Resource{} - err := adapter.Engine.Desc("created_time").Find(&resources, &Resource{Owner: owner, User: user}) + err := ormer.Engine.Desc("created_time").Find(&resources, &Resource{Owner: owner, User: user}) if err != nil { return resources, err } @@ -82,7 +82,7 @@ func getResource(owner string, name string) (*Resource, error) { } resource := Resource{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&resource) + existed, err := ormer.Engine.Get(&resource) if err != nil { return &resource, err } @@ -107,7 +107,7 @@ func UpdateResource(id string, resource *Resource) (bool, error) { return false, nil } - _, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(resource) + _, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(resource) if err != nil { return false, err } @@ -117,7 +117,7 @@ func UpdateResource(id string, resource *Resource) (bool, error) { } func AddResource(resource *Resource) (bool, error) { - affected, err := adapter.Engine.Insert(resource) + affected, err := ormer.Engine.Insert(resource) if err != nil { return false, err } @@ -126,7 +126,7 @@ func AddResource(resource *Resource) (bool, error) { } func DeleteResource(resource *Resource) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{resource.Owner, resource.Name}).Delete(&Resource{}) + affected, err := ormer.Engine.ID(core.PK{resource.Owner, resource.Name}).Delete(&Resource{}) if err != nil { return false, err } diff --git a/object/role.go b/object/role.go index d9b87b5e..a1d560e7 100644 --- a/object/role.go +++ b/object/role.go @@ -44,7 +44,7 @@ func GetRoleCount(owner, field, value string) (int64, error) { func GetRoles(owner string) ([]*Role, error) { roles := []*Role{} - err := adapter.Engine.Desc("created_time").Find(&roles, &Role{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&roles, &Role{Owner: owner}) if err != nil { return roles, err } @@ -69,7 +69,7 @@ func getRole(owner string, name string) (*Role, error) { } role := Role{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&role) + existed, err := ormer.Engine.Get(&role) if err != nil { return &role, err } @@ -137,7 +137,7 @@ func UpdateRole(id string, role *Role) (bool, error) { } } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(role) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(role) if err != nil { return false, err } @@ -178,7 +178,7 @@ func UpdateRole(id string, role *Role) (bool, error) { } func AddRole(role *Role) (bool, error) { - affected, err := adapter.Engine.Insert(role) + affected, err := ormer.Engine.Insert(role) if err != nil { return false, err } @@ -190,7 +190,7 @@ func AddRoles(roles []*Role) bool { if len(roles) == 0 { return false } - affected, err := adapter.Engine.Insert(roles) + affected, err := ormer.Engine.Insert(roles) if err != nil { if !strings.Contains(err.Error(), "Duplicate entry") { panic(err) @@ -240,7 +240,7 @@ func DeleteRole(role *Role) (bool, error) { } } - affected, err := adapter.Engine.ID(core.PK{role.Owner, role.Name}).Delete(&Role{}) + affected, err := ormer.Engine.ID(core.PK{role.Owner, role.Name}).Delete(&Role{}) if err != nil { return false, err } @@ -254,7 +254,7 @@ func (role *Role) GetId() string { func GetRolesByUser(userId string) ([]*Role, error) { roles := []*Role{} - err := adapter.Engine.Where("users like ?", "%"+userId+"\"%").Find(&roles) + err := ormer.Engine.Where("users like ?", "%"+userId+"\"%").Find(&roles) if err != nil { return roles, err } @@ -278,7 +278,7 @@ func GetRolesByUser(userId string) ([]*Role, error) { } func roleChangeTrigger(oldName string, newName string) error { - session := adapter.Engine.NewSession() + session := ormer.Engine.NewSession() defer session.Close() err := session.Begin() @@ -287,7 +287,7 @@ func roleChangeTrigger(oldName string, newName string) error { } var roles []*Role - err = adapter.Engine.Find(&roles) + err = ormer.Engine.Find(&roles) if err != nil { return err } @@ -306,7 +306,7 @@ func roleChangeTrigger(oldName string, newName string) error { } var permissions []*Permission - err = adapter.Engine.Find(&permissions) + err = ormer.Engine.Find(&permissions) if err != nil { return err } @@ -338,7 +338,7 @@ func GetMaskedRoles(roles []*Role) []*Role { func GetRolesByNamePrefix(owner string, prefix string) ([]*Role, error) { roles := []*Role{} - err := adapter.Engine.Where("owner=? and name like ?", owner, prefix+"%").Find(&roles) + err := ormer.Engine.Where("owner=? and name like ?", owner, prefix+"%").Find(&roles) if err != nil { return roles, err } diff --git a/object/session.go b/object/session.go index 3a38dea7..bbc3704f 100644 --- a/object/session.go +++ b/object/session.go @@ -40,9 +40,9 @@ func GetSessions(owner string) ([]*Session, error) { sessions := []*Session{} var err error if owner != "" { - err = adapter.Engine.Desc("created_time").Where("owner = ?", owner).Find(&sessions) + err = ormer.Engine.Desc("created_time").Where("owner = ?", owner).Find(&sessions) } else { - err = adapter.Engine.Desc("created_time").Find(&sessions) + err = ormer.Engine.Desc("created_time").Find(&sessions) } if err != nil { return sessions, err @@ -70,7 +70,7 @@ func GetSessionCount(owner, field, value string) (int64, error) { func GetSingleSession(id string) (*Session, error) { owner, name, application := util.GetOwnerAndNameAndOtherFromId(id) session := Session{Owner: owner, Name: name, Application: application} - get, err := adapter.Engine.Get(&session) + get, err := ormer.Engine.Get(&session) if err != nil { return &session, err } @@ -91,7 +91,7 @@ func UpdateSession(id string, session *Session) (bool, error) { return false, nil } - affected, err := adapter.Engine.ID(core.PK{owner, name, application}).Update(session) + affected, err := ormer.Engine.ID(core.PK{owner, name, application}).Update(session) if err != nil { return false, err } @@ -114,7 +114,7 @@ func AddSession(session *Session) (bool, error) { if dbSession == nil { session.CreatedTime = util.GetCurrentTime() - affected, err := adapter.Engine.Insert(session) + affected, err := ormer.Engine.Insert(session) if err != nil { return false, err } @@ -150,7 +150,7 @@ func DeleteSession(id string) (bool, error) { } } - affected, err := adapter.Engine.ID(core.PK{owner, name, application}).Delete(&Session{}) + affected, err := ormer.Engine.ID(core.PK{owner, name, application}).Delete(&Session{}) if err != nil { return false, err } diff --git a/object/subscription.go b/object/subscription.go index 712f3333..2aba13fa 100644 --- a/object/subscription.go +++ b/object/subscription.go @@ -69,7 +69,7 @@ func GetSubscriptionCount(owner, field, value string) (int64, error) { func GetSubscriptions(owner string) ([]*Subscription, error) { subscriptions := []*Subscription{} - err := adapter.Engine.Desc("created_time").Find(&subscriptions, &Subscription{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&subscriptions, &Subscription{Owner: owner}) if err != nil { return subscriptions, err } @@ -94,7 +94,7 @@ func getSubscription(owner string, name string) (*Subscription, error) { } subscription := Subscription{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&subscription) + existed, err := ormer.Engine.Get(&subscription) if err != nil { return nil, err } @@ -119,7 +119,7 @@ func UpdateSubscription(id string, subscription *Subscription) (bool, error) { return false, nil } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(subscription) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(subscription) if err != nil { return false, err } @@ -128,7 +128,7 @@ func UpdateSubscription(id string, subscription *Subscription) (bool, error) { } func AddSubscription(subscription *Subscription) (bool, error) { - affected, err := adapter.Engine.Insert(subscription) + affected, err := ormer.Engine.Insert(subscription) if err != nil { return false, err } @@ -137,7 +137,7 @@ func AddSubscription(subscription *Subscription) (bool, error) { } func DeleteSubscription(subscription *Subscription) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{subscription.Owner, subscription.Name}).Delete(&Subscription{}) + affected, err := ormer.Engine.ID(core.PK{subscription.Owner, subscription.Name}).Delete(&Subscription{}) if err != nil { return false, err } diff --git a/object/syncer.go b/object/syncer.go index 09037076..f17c3645 100644 --- a/object/syncer.go +++ b/object/syncer.go @@ -53,7 +53,7 @@ type Syncer struct { IsReadOnly bool `json:"isReadOnly"` IsEnabled bool `json:"isEnabled"` - Adapter *Adapter `xorm:"-" json:"-"` + Ormer *Ormer `xorm:"-" json:"-"` } func GetSyncerCount(owner, organization, field, value string) (int64, error) { @@ -63,7 +63,7 @@ func GetSyncerCount(owner, organization, field, value string) (int64, error) { func GetSyncers(owner string) ([]*Syncer, error) { syncers := []*Syncer{} - err := adapter.Engine.Desc("created_time").Find(&syncers, &Syncer{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&syncers, &Syncer{Owner: owner}) if err != nil { return syncers, err } @@ -73,7 +73,7 @@ func GetSyncers(owner string) ([]*Syncer, error) { func GetOrganizationSyncers(owner, organization string) ([]*Syncer, error) { syncers := []*Syncer{} - err := adapter.Engine.Desc("created_time").Find(&syncers, &Syncer{Owner: owner, Organization: organization}) + err := ormer.Engine.Desc("created_time").Find(&syncers, &Syncer{Owner: owner, Organization: organization}) if err != nil { return syncers, err } @@ -98,7 +98,7 @@ func getSyncer(owner string, name string) (*Syncer, error) { } syncer := Syncer{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&syncer) + existed, err := ormer.Engine.Get(&syncer) if err != nil { return &syncer, err } @@ -141,7 +141,7 @@ func UpdateSyncer(id string, syncer *Syncer) (bool, error) { return false, nil } - session := adapter.Engine.ID(core.PK{owner, name}).AllCols() + session := ormer.Engine.ID(core.PK{owner, name}).AllCols() if syncer.Password == "***" { session.Omit("password") } @@ -172,7 +172,7 @@ func updateSyncerErrorText(syncer *Syncer, line string) (bool, error) { s.ErrorText = s.ErrorText + line - affected, err := adapter.Engine.ID(core.PK{s.Owner, s.Name}).Cols("error_text").Update(s) + affected, err := ormer.Engine.ID(core.PK{s.Owner, s.Name}).Cols("error_text").Update(s) if err != nil { return false, err } @@ -181,7 +181,7 @@ func updateSyncerErrorText(syncer *Syncer, line string) (bool, error) { } func AddSyncer(syncer *Syncer) (bool, error) { - affected, err := adapter.Engine.Insert(syncer) + affected, err := ormer.Engine.Insert(syncer) if err != nil { return false, err } @@ -197,7 +197,7 @@ func AddSyncer(syncer *Syncer) (bool, error) { } func DeleteSyncer(syncer *Syncer) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{syncer.Owner, syncer.Name}).Delete(&Syncer{}) + affected, err := ormer.Engine.ID(core.PK{syncer.Owner, syncer.Name}).Delete(&Syncer{}) if err != nil { return false, err } diff --git a/object/syncer_affiliation.go b/object/syncer_affiliation.go index 8b0d86b2..e8c0713c 100644 --- a/object/syncer_affiliation.go +++ b/object/syncer_affiliation.go @@ -21,7 +21,7 @@ type Affiliation struct { func (syncer *Syncer) getAffiliations() ([]*Affiliation, error) { affiliations := []*Affiliation{} - err := syncer.Adapter.Engine.Table(syncer.AffiliationTable).Asc("id").Find(&affiliations) + err := syncer.Ormer.Engine.Table(syncer.AffiliationTable).Asc("id").Find(&affiliations) if err != nil { return nil, err } diff --git a/object/syncer_user.go b/object/syncer_user.go index a592e3f8..99e67b54 100644 --- a/object/syncer_user.go +++ b/object/syncer_user.go @@ -32,7 +32,7 @@ type Credential struct { func (syncer *Syncer) getOriginalUsers() ([]*OriginalUser, error) { sql := fmt.Sprintf("select * from %s", syncer.getTable()) - results, err := syncer.Adapter.Engine.QueryString(sql) + results, err := syncer.Ormer.Engine.QueryString(sql) if err != nil { return nil, err } @@ -67,7 +67,7 @@ func (syncer *Syncer) addUser(user *OriginalUser) (bool, error) { keyString, valueString := syncer.getSqlKeyValueStringFromMap(m) sql := fmt.Sprintf("insert into %s (%s) values (%s)", syncer.getTable(), keyString, valueString) - res, err := syncer.Adapter.Engine.Exec(sql) + res, err := syncer.Ormer.Engine.Exec(sql) if err != nil { return false, err } @@ -108,7 +108,7 @@ func (syncer *Syncer) updateUser(user *OriginalUser) (bool, error) { setString := syncer.getSqlSetStringFromMap(m) sql := fmt.Sprintf("update %s set %s where %s = %s", syncer.getTable(), setString, syncer.TablePrimaryKey, pkValue) - res, err := syncer.Adapter.Engine.Exec(sql) + res, err := syncer.Ormer.Engine.Exec(sql) if err != nil { return false, err } @@ -138,7 +138,7 @@ func (syncer *Syncer) updateUserForOriginalFields(user *User) (bool, error) { columns := syncer.getCasdoorColumns() columns = append(columns, "affiliation", "hash", "pre_hash") - affected, err := adapter.Engine.ID(core.PK{oldUser.Owner, oldUser.Name}).Cols(columns...).Update(user) + affected, err := ormer.Engine.ID(core.PK{oldUser.Owner, oldUser.Name}).Cols(columns...).Update(user) if err != nil { return false, err } @@ -160,7 +160,7 @@ func (syncer *Syncer) calculateHash(user *OriginalUser) string { } func (syncer *Syncer) initAdapter() { - if syncer.Adapter == nil { + if syncer.Ormer == nil { var dataSourceName string if syncer.DatabaseType == "mssql" { dataSourceName = fmt.Sprintf("sqlserver://%s:%s@%s:%d?database=%s", syncer.User, syncer.Password, syncer.Host, syncer.Port, syncer.Database) @@ -174,7 +174,7 @@ func (syncer *Syncer) initAdapter() { dataSourceName = strings.ReplaceAll(dataSourceName, "dbi.", "db.") } - syncer.Adapter = NewAdapter(syncer.DatabaseType, dataSourceName, syncer.Database) + syncer.Ormer = NewAdapter(syncer.DatabaseType, dataSourceName, syncer.Database) } } diff --git a/object/syncer_util.go b/object/syncer_util.go index 7c905c29..a0dad5e9 100644 --- a/object/syncer_util.go +++ b/object/syncer_util.go @@ -196,7 +196,7 @@ func (syncer *Syncer) getOriginalUsersFromMap(results []map[string]string) []*Or if syncer.Type == "Keycloak" { // query and set password and password salt from credential table sql := fmt.Sprintf("select * from credential where type = 'password' and user_id = '%s'", originalUser.Id) - credentialResult, _ := syncer.Adapter.Engine.QueryString(sql) + credentialResult, _ := syncer.Ormer.Engine.QueryString(sql) if len(credentialResult) > 0 { credential := Credential{} _ = json.Unmarshal([]byte(credentialResult[0]["SECRET_DATA"]), &credential) @@ -206,7 +206,7 @@ func (syncer *Syncer) getOriginalUsersFromMap(results []map[string]string) []*Or // query and set signup application from user group table sql = fmt.Sprintf("select name from keycloak_group where id = "+ "(select group_id as gid from user_group_membership where user_id = '%s')", originalUser.Id) - groupResult, _ := syncer.Adapter.Engine.QueryString(sql) + groupResult, _ := syncer.Ormer.Engine.QueryString(sql) if len(groupResult) > 0 { originalUser.SignupApplication = groupResult[0]["name"] } diff --git a/object/token.go b/object/token.go index 4f5db899..fa8be8e3 100644 --- a/object/token.go +++ b/object/token.go @@ -98,7 +98,7 @@ func GetTokenCount(owner, organization, field, value string) (int64, error) { func GetTokens(owner string, organization string) ([]*Token, error) { tokens := []*Token{} - err := adapter.Engine.Desc("created_time").Find(&tokens, &Token{Owner: owner, Organization: organization}) + err := ormer.Engine.Desc("created_time").Find(&tokens, &Token{Owner: owner, Organization: organization}) return tokens, err } @@ -115,7 +115,7 @@ func getToken(owner string, name string) (*Token, error) { } token := Token{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&token) + existed, err := ormer.Engine.Get(&token) if err != nil { return nil, err } @@ -129,7 +129,7 @@ func getToken(owner string, name string) (*Token, error) { func getTokenByCode(code string) (*Token, error) { token := Token{Code: code} - existed, err := adapter.Engine.Get(&token) + existed, err := ormer.Engine.Get(&token) if err != nil { return nil, err } @@ -142,7 +142,7 @@ func getTokenByCode(code string) (*Token, error) { } func updateUsedByCode(token *Token) bool { - affected, err := adapter.Engine.Where("code=?", token.Code).Cols("code_is_used").Update(token) + affected, err := ormer.Engine.Where("code=?", token.Code).Cols("code_is_used").Update(token) if err != nil { panic(err) } @@ -167,7 +167,7 @@ func UpdateToken(id string, token *Token) (bool, error) { return false, nil } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(token) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(token) if err != nil { return false, err } @@ -176,7 +176,7 @@ func UpdateToken(id string, token *Token) (bool, error) { } func AddToken(token *Token) (bool, error) { - affected, err := adapter.Engine.Insert(token) + affected, err := ormer.Engine.Insert(token) if err != nil { return false, err } @@ -185,7 +185,7 @@ func AddToken(token *Token) (bool, error) { } func DeleteToken(token *Token) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{token.Owner, token.Name}).Delete(&Token{}) + affected, err := ormer.Engine.ID(core.PK{token.Owner, token.Name}).Delete(&Token{}) if err != nil { return false, err } @@ -195,7 +195,7 @@ func DeleteToken(token *Token) (bool, error) { func ExpireTokenByAccessToken(accessToken string) (bool, *Application, *Token, error) { token := Token{AccessToken: accessToken} - existed, err := adapter.Engine.Get(&token) + existed, err := ormer.Engine.Get(&token) if err != nil { return false, nil, nil, err } @@ -205,7 +205,7 @@ func ExpireTokenByAccessToken(accessToken string) (bool, *Application, *Token, e } token.ExpiresIn = 0 - affected, err := adapter.Engine.ID(core.PK{token.Owner, token.Name}).Cols("expires_in").Update(&token) + affected, err := ormer.Engine.ID(core.PK{token.Owner, token.Name}).Cols("expires_in").Update(&token) if err != nil { return false, nil, nil, err } @@ -221,7 +221,7 @@ func ExpireTokenByAccessToken(accessToken string) (bool, *Application, *Token, e func GetTokenByAccessToken(accessToken string) (*Token, error) { // Check if the accessToken is in the database token := Token{AccessToken: accessToken} - existed, err := adapter.Engine.Get(&token) + existed, err := ormer.Engine.Get(&token) if err != nil { return nil, err } @@ -235,7 +235,7 @@ func GetTokenByAccessToken(accessToken string) (*Token, error) { func GetTokenByTokenAndApplication(token string, application string) (*Token, error) { tokenResult := Token{} - existed, err := adapter.Engine.Where("(refresh_token = ? or access_token = ? ) and application = ?", token, token, application).Get(&tokenResult) + existed, err := ormer.Engine.Where("(refresh_token = ? or access_token = ? ) and application = ?", token, token, application).Get(&tokenResult) if err != nil { return nil, err } @@ -440,7 +440,7 @@ func RefreshToken(grantType string, refreshToken string, scope string, clientId } // check whether the refresh token is valid, and has not expired. token := Token{RefreshToken: refreshToken} - existed, err := adapter.Engine.Get(&token) + existed, err := ormer.Engine.Get(&token) if err != nil || !existed { return &TokenError{ Error: InvalidGrant, diff --git a/object/user.go b/object/user.go index 60048b10..ab5adb79 100644 --- a/object/user.go +++ b/object/user.go @@ -207,7 +207,7 @@ func GetGlobalUserCount(field, value string) (int64, error) { func GetGlobalUsers() ([]*User, error) { users := []*User{} - err := adapter.Engine.Desc("created_time").Find(&users) + err := ormer.Engine.Desc("created_time").Find(&users) if err != nil { return nil, err } @@ -237,12 +237,12 @@ func GetUserCount(owner, field, value string, groupName string) (int64, error) { } func GetOnlineUserCount(owner string, isOnline int) (int64, error) { - return adapter.Engine.Where("is_online = ?", isOnline).Count(&User{Owner: owner}) + return ormer.Engine.Where("is_online = ?", isOnline).Count(&User{Owner: owner}) } func GetUsers(owner string) ([]*User, error) { users := []*User{} - err := adapter.Engine.Desc("created_time").Find(&users, &User{Owner: owner}) + err := ormer.Engine.Desc("created_time").Find(&users, &User{Owner: owner}) if err != nil { return nil, err } @@ -252,7 +252,7 @@ func GetUsers(owner string) ([]*User, error) { func GetUsersByTag(owner string, tag string) ([]*User, error) { users := []*User{} - err := adapter.Engine.Desc("created_time").Find(&users, &User{Owner: owner, Tag: tag}) + err := ormer.Engine.Desc("created_time").Find(&users, &User{Owner: owner, Tag: tag}) if err != nil { return nil, err } @@ -262,7 +262,7 @@ func GetUsersByTag(owner string, tag string) ([]*User, error) { func GetSortedUsers(owner string, sorter string, limit int) ([]*User, error) { users := []*User{} - err := adapter.Engine.Desc(sorter).Limit(limit, 0).Find(&users, &User{Owner: owner}) + err := ormer.Engine.Desc(sorter).Limit(limit, 0).Find(&users, &User{Owner: owner}) if err != nil { return nil, err } @@ -291,7 +291,7 @@ func getUser(owner string, name string) (*User, error) { } user := User{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&user) + existed, err := ormer.Engine.Get(&user) if err != nil { return nil, err } @@ -309,7 +309,7 @@ func getUserById(owner string, id string) (*User, error) { } user := User{Owner: owner, Id: id} - existed, err := adapter.Engine.Get(&user) + existed, err := ormer.Engine.Get(&user) if err != nil { return nil, err } @@ -326,7 +326,7 @@ func getUserByWechatId(owner string, wechatOpenId string, wechatUnionId string) wechatUnionId = wechatOpenId } user := &User{} - existed, err := adapter.Engine.Where("owner = ?", owner).Where("wechat = ? OR wechat = ?", wechatOpenId, wechatUnionId).Get(user) + existed, err := ormer.Engine.Where("owner = ?", owner).Where("wechat = ? OR wechat = ?", wechatOpenId, wechatUnionId).Get(user) if err != nil { return nil, err } @@ -344,7 +344,7 @@ func GetUserByEmail(owner string, email string) (*User, error) { } user := User{Owner: owner, Email: email} - existed, err := adapter.Engine.Get(&user) + existed, err := ormer.Engine.Get(&user) if err != nil { return nil, err } @@ -362,7 +362,7 @@ func GetUserByPhone(owner string, phone string) (*User, error) { } user := User{Owner: owner, Phone: phone} - existed, err := adapter.Engine.Get(&user) + existed, err := ormer.Engine.Get(&user) if err != nil { return nil, err } @@ -380,7 +380,7 @@ func GetUserByUserId(owner string, userId string) (*User, error) { } user := User{Owner: owner, Id: userId} - existed, err := adapter.Engine.Get(&user) + existed, err := ormer.Engine.Get(&user) if err != nil { return nil, err } @@ -397,7 +397,7 @@ func GetUserByAccessKey(accessKey string) (*User, error) { return nil, nil } user := User{AccessKey: accessKey} - existed, err := adapter.Engine.Get(&user) + existed, err := ormer.Engine.Get(&user) if err != nil { return nil, err } @@ -471,7 +471,7 @@ func GetMaskedUsers(users []*User, errs ...error) ([]*User, error) { func GetLastUser(owner string) (*User, error) { user := User{Owner: owner} - existed, err := adapter.Engine.Desc("created_time", "id").Get(&user) + existed, err := ormer.Engine.Desc("created_time", "id").Get(&user) if err != nil { return nil, err } @@ -546,7 +546,7 @@ func updateUser(id string, user *User, columns []string) (int64, error) { return 0, err } - affected, err := adapter.Engine.ID(core.PK{owner, name}).Cols(columns...).Update(user) + affected, err := ormer.Engine.ID(core.PK{owner, name}).Cols(columns...).Update(user) if err != nil { return 0, err } @@ -584,7 +584,7 @@ func UpdateUserForAllFields(id string, user *User) (bool, error) { } } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(user) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(user) if err != nil { return false, err } @@ -638,7 +638,7 @@ func AddUser(user *User) (bool, error) { } user.Ranking = int(count + 1) - affected, err := adapter.Engine.Insert(user) + affected, err := ormer.Engine.Insert(user) if err != nil { return false, err } @@ -670,7 +670,7 @@ func AddUsers(users []*User) (bool, error) { } } - affected, err := adapter.Engine.Insert(users) + affected, err := ormer.Engine.Insert(users) if err != nil { if !strings.Contains(err.Error(), "Duplicate entry") { return false, err @@ -715,7 +715,7 @@ func DeleteUser(user *User) (bool, error) { return false, err } - affected, err := adapter.Engine.ID(core.PK{user.Owner, user.Name}).Delete(&User{}) + affected, err := ormer.Engine.ID(core.PK{user.Owner, user.Name}).Delete(&User{}) if err != nil { return false, err } @@ -779,7 +779,7 @@ func ExtendUserWithRolesAndPermissions(user *User) (err error) { } func userChangeTrigger(oldName string, newName string) error { - session := adapter.Engine.NewSession() + session := ormer.Engine.NewSession() defer session.Close() err := session.Begin() @@ -788,7 +788,7 @@ func userChangeTrigger(oldName string, newName string) error { } var roles []*Role - err = adapter.Engine.Find(&roles) + err = ormer.Engine.Find(&roles) if err != nil { return err } @@ -808,7 +808,7 @@ func userChangeTrigger(oldName string, newName string) error { } var permissions []*Permission - err = adapter.Engine.Find(&permissions) + err = ormer.Engine.Find(&permissions) if err != nil { return err } diff --git a/object/user_test.go b/object/user_test.go index 858f360a..6ae251ba 100644 --- a/object/user_test.go +++ b/object/user_test.go @@ -25,7 +25,7 @@ import ( ) func updateUserColumn(column string, user *User) bool { - affected, err := adapter.Engine.ID(core.PK{user.Owner, user.Name}).Cols(column).Update(user) + affected, err := ormer.Engine.ID(core.PK{user.Owner, user.Name}).Cols(column).Update(user) if err != nil { panic(err) } diff --git a/object/user_util.go b/object/user_util.go index 75588272..2122f5b1 100644 --- a/object/user_util.go +++ b/object/user_util.go @@ -30,7 +30,7 @@ func GetUserByField(organizationName string, field string, value string) (*User, } user := User{Owner: organizationName} - existed, err := adapter.Engine.Where(fmt.Sprintf("%s=?", strings.ToLower(field)), value).Get(&user) + existed, err := ormer.Engine.Where(fmt.Sprintf("%s=?", strings.ToLower(field)), value).Get(&user) if err != nil { return nil, err } @@ -95,7 +95,7 @@ func SetUserField(user *User, field string, value string) (bool, error) { bean[strings.ToLower(field)] = value } - affected, err := adapter.Engine.Table(user).ID(core.PK{user.Owner, user.Name}).Update(bean) + affected, err := ormer.Engine.Table(user).ID(core.PK{user.Owner, user.Name}).Update(bean) if err != nil { return false, err } @@ -110,7 +110,7 @@ func SetUserField(user *User, field string, value string) (bool, error) { return false, err } - _, err = adapter.Engine.ID(core.PK{user.Owner, user.Name}).Cols("hash").Update(user) + _, err = ormer.Engine.ID(core.PK{user.Owner, user.Name}).Cols("hash").Update(user) if err != nil { return false, err } @@ -191,7 +191,7 @@ func ClearUserOAuthProperties(user *User, providerType string) (bool, error) { } } - affected, err := adapter.Engine.ID(core.PK{user.Owner, user.Name}).Cols("properties").Update(user) + affected, err := ormer.Engine.ID(core.PK{user.Owner, user.Name}).Cols("properties").Update(user) if err != nil { return false, err } diff --git a/object/verification.go b/object/verification.go index 426d9bfd..7ff8f741 100644 --- a/object/verification.go +++ b/object/verification.go @@ -66,7 +66,7 @@ func IsAllowSend(user *User, remoteAddr, recordType string) error { if user != nil { record.User = user.GetId() } - has, err := adapter.Engine.Desc("created_time").Get(&record) + has, err := ormer.Engine.Desc("created_time").Get(&record) if err != nil { return err } @@ -143,7 +143,7 @@ func AddToVerificationRecord(user *User, provider *Provider, remoteAddr, recordT record.Time = time.Now().Unix() record.IsUsed = false - _, err := adapter.Engine.Insert(record) + _, err := ormer.Engine.Insert(record) if err != nil { return err } @@ -154,7 +154,7 @@ func AddToVerificationRecord(user *User, provider *Provider, remoteAddr, recordT func getVerificationRecord(dest string) (*VerificationRecord, error) { var record VerificationRecord record.Receiver = dest - has, err := adapter.Engine.Desc("time").Where("is_used = false").Get(&record) + has, err := ormer.Engine.Desc("time").Where("is_used = false").Get(&record) if err != nil { return nil, err } @@ -198,7 +198,7 @@ func DisableVerificationCode(dest string) (err error) { } record.IsUsed = true - _, err = adapter.Engine.ID(core.PK{record.Owner, record.Name}).AllCols().Update(record) + _, err = ormer.Engine.ID(core.PK{record.Owner, record.Name}).AllCols().Update(record) return } diff --git a/object/webhook.go b/object/webhook.go index 9b4e8a88..aa9331ac 100644 --- a/object/webhook.go +++ b/object/webhook.go @@ -49,7 +49,7 @@ func GetWebhookCount(owner, organization, field, value string) (int64, error) { func GetWebhooks(owner string, organization string) ([]*Webhook, error) { webhooks := []*Webhook{} - err := adapter.Engine.Desc("created_time").Find(&webhooks, &Webhook{Owner: owner, Organization: organization}) + err := ormer.Engine.Desc("created_time").Find(&webhooks, &Webhook{Owner: owner, Organization: organization}) if err != nil { return webhooks, err } @@ -70,7 +70,7 @@ func GetPaginationWebhooks(owner, organization string, offset, limit int, field, func getWebhooksByOrganization(organization string) ([]*Webhook, error) { webhooks := []*Webhook{} - err := adapter.Engine.Desc("created_time").Find(&webhooks, &Webhook{Organization: organization}) + err := ormer.Engine.Desc("created_time").Find(&webhooks, &Webhook{Organization: organization}) if err != nil { return webhooks, err } @@ -84,7 +84,7 @@ func getWebhook(owner string, name string) (*Webhook, error) { } webhook := Webhook{Owner: owner, Name: name} - existed, err := adapter.Engine.Get(&webhook) + existed, err := ormer.Engine.Get(&webhook) if err != nil { return &webhook, err } @@ -109,7 +109,7 @@ func UpdateWebhook(id string, webhook *Webhook) (bool, error) { return false, nil } - affected, err := adapter.Engine.ID(core.PK{owner, name}).AllCols().Update(webhook) + affected, err := ormer.Engine.ID(core.PK{owner, name}).AllCols().Update(webhook) if err != nil { return false, err } @@ -118,7 +118,7 @@ func UpdateWebhook(id string, webhook *Webhook) (bool, error) { } func AddWebhook(webhook *Webhook) (bool, error) { - affected, err := adapter.Engine.Insert(webhook) + affected, err := ormer.Engine.Insert(webhook) if err != nil { return false, err } @@ -127,7 +127,7 @@ func AddWebhook(webhook *Webhook) (bool, error) { } func DeleteWebhook(webhook *Webhook) (bool, error) { - affected, err := adapter.Engine.ID(core.PK{webhook.Owner, webhook.Name}).Delete(&Webhook{}) + affected, err := ormer.Engine.ID(core.PK{webhook.Owner, webhook.Name}).Delete(&Webhook{}) if err != nil { return false, err } diff --git a/routers/authz_filter.go b/routers/authz_filter.go index 7a59fa62..f8a972c6 100644 --- a/routers/authz_filter.go +++ b/routers/authz_filter.go @@ -150,7 +150,7 @@ func getUrlPath(urlPath string) string { return urlPath } -func AuthzFilter(ctx *context.Context) { +func ApiFilter(ctx *context.Context) { subOwner, subName := getSubject(ctx) method := ctx.Request.Method urlPath := getUrlPath(ctx.Request.URL.Path) diff --git a/routers/router.go b/routers/router.go index e3e33495..4ea4cc8f 100644 --- a/routers/router.go +++ b/routers/router.go @@ -117,11 +117,11 @@ func initAPI() { beego.Router("/api/add-model", &controllers.ApiController{}, "POST:AddModel") beego.Router("/api/delete-model", &controllers.ApiController{}, "POST:DeleteModel") - beego.Router("/api/get-adapters", &controllers.ApiController{}, "GET:GetCasbinAdapters") - beego.Router("/api/get-adapter", &controllers.ApiController{}, "GET:GetCasbinAdapter") - beego.Router("/api/update-adapter", &controllers.ApiController{}, "POST:UpdateCasbinAdapter") - beego.Router("/api/add-adapter", &controllers.ApiController{}, "POST:AddCasbinAdapter") - beego.Router("/api/delete-adapter", &controllers.ApiController{}, "POST:DeleteCasbinAdapter") + beego.Router("/api/get-adapters", &controllers.ApiController{}, "GET:GetAdapters") + beego.Router("/api/get-adapter", &controllers.ApiController{}, "GET:GetAdapter") + beego.Router("/api/update-adapter", &controllers.ApiController{}, "POST:UpdateAdapter") + beego.Router("/api/add-adapter", &controllers.ApiController{}, "POST:AddAdapter") + beego.Router("/api/delete-adapter", &controllers.ApiController{}, "POST:DeleteAdapter") beego.Router("/api/sync-policies", &controllers.ApiController{}, "GET:SyncPolicies") beego.Router("/api/update-policy", &controllers.ApiController{}, "POST:UpdatePolicy") beego.Router("/api/add-policy", &controllers.ApiController{}, "POST:AddPolicy") @@ -261,18 +261,6 @@ func initAPI() { beego.Router("/api/send-email", &controllers.ApiController{}, "POST:SendEmail") beego.Router("/api/send-sms", &controllers.ApiController{}, "POST:SendSms") - beego.Router("/.well-known/openid-configuration", &controllers.RootController{}, "GET:GetOidcDiscovery") - beego.Router("/.well-known/jwks", &controllers.RootController{}, "*:GetJwks") - - beego.Router("/cas/:organization/:application/serviceValidate", &controllers.RootController{}, "GET:CasServiceValidate") - beego.Router("/cas/:organization/:application/proxyValidate", &controllers.RootController{}, "GET:CasProxyValidate") - beego.Router("/cas/:organization/:application/proxy", &controllers.RootController{}, "GET:CasProxy") - beego.Router("/cas/:organization/:application/validate", &controllers.RootController{}, "GET:CasValidate") - - beego.Router("/cas/:organization/:application/p3/serviceValidate", &controllers.RootController{}, "GET:CasP3ServiceAndProxyValidate") - beego.Router("/cas/:organization/:application/p3/proxyValidate", &controllers.RootController{}, "GET:CasP3ServiceAndProxyValidate") - beego.Router("/cas/:organization/:application/samlValidate", &controllers.RootController{}, "POST:SamlValidate") - beego.Router("/api/webauthn/signup/begin", &controllers.ApiController{}, "Get:WebAuthnSignupBegin") beego.Router("/api/webauthn/signup/finish", &controllers.ApiController{}, "Post:WebAuthnSignupFinish") beego.Router("/api/webauthn/signin/begin", &controllers.ApiController{}, "Get:WebAuthnSigninBegin") @@ -290,4 +278,16 @@ func initAPI() { beego.Router("/api/get-prometheus-info", &controllers.ApiController{}, "GET:GetPrometheusInfo") beego.Handler("/api/metrics", promhttp.Handler()) + + beego.Router("/.well-known/openid-configuration", &controllers.RootController{}, "GET:GetOidcDiscovery") + beego.Router("/.well-known/jwks", &controllers.RootController{}, "*:GetJwks") + + beego.Router("/cas/:organization/:application/serviceValidate", &controllers.RootController{}, "GET:CasServiceValidate") + beego.Router("/cas/:organization/:application/proxyValidate", &controllers.RootController{}, "GET:CasProxyValidate") + beego.Router("/cas/:organization/:application/proxy", &controllers.RootController{}, "GET:CasProxy") + beego.Router("/cas/:organization/:application/validate", &controllers.RootController{}, "GET:CasValidate") + + beego.Router("/cas/:organization/:application/p3/serviceValidate", &controllers.RootController{}, "GET:CasP3ServiceAndProxyValidate") + beego.Router("/cas/:organization/:application/p3/proxyValidate", &controllers.RootController{}, "GET:CasP3ServiceAndProxyValidate") + beego.Router("/cas/:organization/:application/samlValidate", &controllers.RootController{}, "POST:SamlValidate") } diff --git a/swagger/swagger.json b/swagger/swagger.json index 5c1f5d94..c9e61e14 100644 --- a/swagger/swagger.json +++ b/swagger/swagger.json @@ -53,7 +53,7 @@ "Adapter API" ], "description": "add adapter", - "operationId": "ApiController.AddCasbinAdapter", + "operationId": "ApiController.AddAdapter", "parameters": [ { "in": "body", @@ -999,7 +999,7 @@ "Adapter API" ], "description": "delete adapter", - "operationId": "ApiController.DeleteCasbinAdapter", + "operationId": "ApiController.DeleteAdapter", "parameters": [ { "in": "body", @@ -1751,7 +1751,7 @@ "Adapter API" ], "description": "get adapter", - "operationId": "ApiController.GetCasbinAdapter", + "operationId": "ApiController.GetAdapter", "parameters": [ { "in": "query", @@ -1777,7 +1777,7 @@ "Adapter API" ], "description": "get adapters", - "operationId": "ApiController.GetCasbinAdapters", + "operationId": "ApiController.GetAdapters", "parameters": [ { "in": "query", @@ -4382,7 +4382,7 @@ "Adapter API" ], "description": "update adapter", - "operationId": "ApiController.UpdateCasbinAdapter", + "operationId": "ApiController.UpdateAdapter", "parameters": [ { "in": "query", diff --git a/swagger/swagger.yml b/swagger/swagger.yml index 2b51a7df..21ee9a40 100644 --- a/swagger/swagger.yml +++ b/swagger/swagger.yml @@ -36,7 +36,7 @@ paths: tags: - Adapter API description: add adapter - operationId: ApiController.AddCasbinAdapter + operationId: ApiController.AddAdapter parameters: - in: body name: body @@ -647,7 +647,7 @@ paths: tags: - Adapter API description: delete adapter - operationId: ApiController.DeleteCasbinAdapter + operationId: ApiController.DeleteAdapter parameters: - in: body name: body @@ -1131,7 +1131,7 @@ paths: tags: - Adapter API description: get adapter - operationId: ApiController.GetCasbinAdapter + operationId: ApiController.GetAdapter parameters: - in: query name: id @@ -1148,7 +1148,7 @@ paths: tags: - Adapter API description: get adapters - operationId: ApiController.GetCasbinAdapters + operationId: ApiController.GetAdapters parameters: - in: query name: owner @@ -2861,7 +2861,7 @@ paths: tags: - Adapter API description: update adapter - operationId: ApiController.UpdateCasbinAdapter + operationId: ApiController.UpdateAdapter parameters: - in: query name: id diff --git a/web/src/AdapterEditPage.js b/web/src/AdapterEditPage.js index ab01429b..c5edd00b 100644 --- a/web/src/AdapterEditPage.js +++ b/web/src/AdapterEditPage.js @@ -13,7 +13,7 @@ // limitations under the License. import React from "react"; -import {Button, Card, Col, Input, InputNumber, Row, Select, Switch} from "antd"; +import {Button, Card, Col, Input, Row, Select, Switch} from "antd"; import * as AdapterBackend from "./backend/AdapterBackend"; import * as OrganizationBackend from "./backend/OrganizationBackend"; import * as Setting from "./Setting"; @@ -88,9 +88,9 @@ class AdapterEditPage extends React.Component { } parseAdapterField(key, value) { - if (["port"].includes(key)) { - value = Setting.myParseInt(value); - } + // if ([].includes(key)) { + // value = Setting.myParseInt(value); + // } return value; } @@ -104,6 +104,73 @@ class AdapterEditPage extends React.Component { }); } + renderDataSourceNameConfig() { + if (Setting.builtInObject(this.state.adapter)) { + return null; + } + return ( + { + this.state.adapter.databaseType === "sqlite3" ? + ( + + + {Setting.getLabel(i18next.t("syncer:File"), i18next.t("provider:File - Tooltip"))} : + + + { + this.updateAdapterField("file", e.target.value); + }} /> + + + ) : ( + + + + {Setting.getLabel(i18next.t("provider:Host"), i18next.t("provider:Host - Tooltip"))} : + + + { + this.updateAdapterField("host", e.target.value); + }} /> + + + + + {Setting.getLabel(i18next.t("provider:Port"), i18next.t("provider:Port - Tooltip"))} : + + + { + this.updateAdapterField("port", e.target.value); + }} /> + + + + + {Setting.getLabel(i18next.t("general:User"), i18next.t("general:User - Tooltip"))} : + + + { + this.updateAdapterField("user", e.target.value); + }} /> + + + + + {Setting.getLabel(i18next.t("general:Password"), i18next.t("general:Password - Tooltip"))} : + + + { + this.updateAdapterField("password", e.target.value); + }} /> + + + + ) + } + + ); + } + renderAdapter() { return ( - { this.getModels(value); this.updateAdapterField("owner", value); })}> @@ -134,7 +201,7 @@ class AdapterEditPage extends React.Component { {Setting.getLabel(i18next.t("general:Name"), i18next.t("general:Name - Tooltip"))} : - { + { this.updateAdapterField("name", e.target.value); }} /> @@ -144,7 +211,7 @@ class AdapterEditPage extends React.Component { {Setting.getLabel(i18next.t("provider:Type"), i18next.t("provider:Type - Tooltip"))} : - { this.updateAdapterField("type", value); const adapter = this.state.adapter; // adapter["tableColumns"] = Setting.getAdapterTableColumns(this.state.adapter); @@ -159,52 +226,12 @@ class AdapterEditPage extends React.Component { - - - {Setting.getLabel(i18next.t("provider:Host"), i18next.t("provider:Host - Tooltip"))} : - - - { - this.updateAdapterField("host", e.target.value); - }} /> - - - - - {Setting.getLabel(i18next.t("provider:Port"), i18next.t("provider:Port - Tooltip"))} : - - - { - this.updateAdapterField("port", value); - }} /> - - - - - {Setting.getLabel(i18next.t("general:User"), i18next.t("general:User - Tooltip"))} : - - - { - this.updateAdapterField("user", e.target.value); - }} /> - - - - - {Setting.getLabel(i18next.t("general:Password"), i18next.t("general:Password - Tooltip"))} : - - - { - this.updateAdapterField("password", e.target.value); - }} /> - - {Setting.getLabel(i18next.t("syncer:Database type"), i18next.t("syncer:Database type - Tooltip"))} : - {this.updateAdapterField("databaseType", value);})}> { [ {id: "mysql", name: "MySQL"}, @@ -217,12 +244,13 @@ class AdapterEditPage extends React.Component { + {this.state.adapter.type === "Database" ? this.renderDataSourceNameConfig() : null} {Setting.getLabel(i18next.t("syncer:Database"), i18next.t("syncer:Database - Tooltip"))} : - { + { this.updateAdapterField("database", e.target.value); }} /> @@ -233,7 +261,7 @@ class AdapterEditPage extends React.Component { { + disabled={Setting.builtInObject(this.state.adapter)} onChange={e => { this.updateAdapterField("table", e.target.value); }} /> diff --git a/web/src/AdapterListPage.js b/web/src/AdapterListPage.js index 094ca42a..bef69e2c 100644 --- a/web/src/AdapterListPage.js +++ b/web/src/AdapterListPage.js @@ -32,7 +32,7 @@ class AdapterListPage extends BaseListPage { createdTime: moment().format(), type: "Database", host: "localhost", - port: 3306, + port: "3306", user: "root", password: "123456", databaseType: "mysql", @@ -206,6 +206,7 @@ class AdapterListPage extends BaseListPage {
this.deleteAdapter(index)} > diff --git a/web/src/EnforcerEditPage.js b/web/src/EnforcerEditPage.js index 99dae1f9..0d8ab029 100644 --- a/web/src/EnforcerEditPage.js +++ b/web/src/EnforcerEditPage.js @@ -122,7 +122,7 @@ class EnforcerEditPage extends React.Component { {Setting.getLabel(i18next.t("general:Organization"), i18next.t("general:Organization - Tooltip"))} : - { this.updateEnforcerField("owner", owner); this.getModels(owner); this.getAdapters(owner); @@ -136,7 +136,7 @@ class EnforcerEditPage extends React.Component { {Setting.getLabel(i18next.t("general:Name"), i18next.t("general:Name - Tooltip"))} : - { + { this.updateEnforcerField("name", e.target.value); }} /> @@ -166,10 +166,10 @@ class EnforcerEditPage extends React.Component { {Setting.getLabel(i18next.t("general:Model"), i18next.t("general:Model - Tooltip"))} : - { this.updateEnforcerField("model", model); })} - options={this.state.models.map((model) => Setting.getOption(model.displayName, model.name)) + options={this.state.models.map((model) => Setting.getOption(model.displayName, `${model.owner}/${model.name}`)) } /> @@ -178,10 +178,10 @@ class EnforcerEditPage extends React.Component { {Setting.getLabel(i18next.t("general:Adapter"), i18next.t("general:Adapter - Tooltip"))} : - { this.updateEnforcerField("adapter", adapter); })} - options={this.state.adapters.map((adapter) => Setting.getOption(adapter.name, adapter.name)) + options={this.state.adapters.map((adapter) => Setting.getOption(adapter.name, `${adapter.owner}/${adapter.name}`)) } /> diff --git a/web/src/EnforcerListPage.js b/web/src/EnforcerListPage.js index 080ed966..478d7a4c 100644 --- a/web/src/EnforcerListPage.js +++ b/web/src/EnforcerListPage.js @@ -144,6 +144,7 @@ class EnforcerListPage extends BaseListPage { this.deleteEnforcer(index)} > diff --git a/web/src/ModelEditPage.js b/web/src/ModelEditPage.js index f103c91c..25460fac 100644 --- a/web/src/ModelEditPage.js +++ b/web/src/ModelEditPage.js @@ -105,7 +105,7 @@ class ModelEditPage extends React.Component { {Setting.getLabel(i18next.t("general:Organization"), i18next.t("general:Organization - Tooltip"))} : - {this.updateModelField("owner", value);})}> { this.state.organizations.map((organization, index) => ) } @@ -117,7 +117,7 @@ class ModelEditPage extends React.Component { {Setting.getLabel(i18next.t("general:Name"), i18next.t("general:Name - Tooltip"))} : - { + { this.updateModelField("name", e.target.value); }} /> @@ -152,6 +152,9 @@ class ModelEditPage extends React.Component { value={this.state.model.modelText} options={{mode: "properties", theme: "default"}} onBeforeChange={(editor, data, value) => { + if (Setting.builtInObject(this.state.model)) { + return; + } this.updateModelField("modelText", value); }} /> diff --git a/web/src/ModelListPage.js b/web/src/ModelListPage.js index 5d72e6a4..f59c4e50 100644 --- a/web/src/ModelListPage.js +++ b/web/src/ModelListPage.js @@ -160,6 +160,7 @@ class ModelListPage extends BaseListPage { this.deleteModel(index)} > diff --git a/web/src/Setting.js b/web/src/Setting.js index f2cf2633..c9297d96 100644 --- a/web/src/Setting.js +++ b/web/src/Setting.js @@ -1218,3 +1218,19 @@ export function isDefaultOrganizationSelected(account) { } return false; } + +const BuiltInObjects = [ + "api-enforcer-built-in", + "permission-enforcer-built-in", + "api-model-built-in", + "permission-model-built-in", + "api-adapter-built-in", + "permission-adapter-built-in", +]; + +export function builtInObject(obj) { + if (obj === undefined || obj === null) { + return false; + } + return obj.owner === "built-in" && BuiltInObjects.includes(obj.name); +}