Compare commits

..

8 Commits

Author SHA1 Message Date
haiwu
eefa1e6df4 fix: fix paypal payment provider and refactor payment code (#2159)
* feat: support paypal payment provider

* feat: support paypal flow

* feat: use owner replace org for payment

* feat: update paypal logic

* feat: gofumpt

* feat: update payment

* fix: fix notify

* feat: delete log
2023-07-30 11:54:42 +08:00
Yaodong Yu
026fb207b3 fix: remove model in adapter page (#2161) 2023-07-29 23:42:08 +08:00
Yaodong Yu
ea10f8e615 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
2023-07-29 15:07:04 +08:00
Yang Luo
74b058aa3f Fix sync-ldap-users() bug, brought by: 666ff48837 2023-07-29 13:14:55 +08:00
Yang Luo
6c628d7893 Fix static path not changed bug in makeGzipResponse() 2023-07-29 12:23:48 +08:00
Yang Luo
a38896e4d8 Improve swagger docs 2023-07-29 11:35:03 +08:00
Yang Luo
5f054c4989 Fix product links 2023-07-28 15:08:45 +08:00
Tower He
fb16d8cee6 fix: not set count of enforcers to the response (#2155) 2023-07-28 14:46:11 +08:00
87 changed files with 1686 additions and 1334 deletions

View File

@@ -18,56 +18,22 @@ import (
"strings" "strings"
"github.com/casbin/casbin/v2" "github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/model"
"github.com/casdoor/casdoor/conf" "github.com/casdoor/casdoor/conf"
"github.com/casdoor/casdoor/object" "github.com/casdoor/casdoor/object"
"github.com/casdoor/casdoor/util" "github.com/casdoor/casdoor/util"
xormadapter "github.com/casdoor/xorm-adapter/v3"
stringadapter "github.com/qiangmzsx/string-adapter/v2" stringadapter "github.com/qiangmzsx/string-adapter/v2"
) )
var Enforcer *casbin.Enforcer var Enforcer *casbin.Enforcer
func InitAuthz() { func InitApi() {
var err error var err error
tableNamePrefix := conf.GetConfigString("tableNamePrefix") e, err := object.GetEnforcer(util.GetId("built-in", "api-enforcer-built-in"))
driverName := conf.GetConfigString("driverName")
dataSourceName := conf.GetConfigRealDataSourceName(driverName)
a, err := xormadapter.NewAdapterWithTableName(driverName, dataSourceName, "casbin_rule", tableNamePrefix, true)
if err != nil { if err != nil {
panic(err) panic(err)
} }
Enforcer, err = e.InitEnforcer()
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)
if err != nil { if err != nil {
panic(err) panic(err)
} }

View File

@@ -23,14 +23,14 @@ import (
xormadapter "github.com/casdoor/xorm-adapter/v3" xormadapter "github.com/casdoor/xorm-adapter/v3"
) )
// GetCasbinAdapters // GetAdapters
// @Title GetCasbinAdapters // @Title GetAdapters
// @Tag Adapter API // @Tag Adapter API
// @Description get adapters // @Description get adapters
// @Param owner query string true "The owner of adapters" // @Param owner query string true "The owner of adapters"
// @Success 200 {array} object.Adapter The Response object // @Success 200 {array} object.Adapter The Response object
// @router /get-adapters [get] // @router /get-adapters [get]
func (c *ApiController) GetCasbinAdapters() { func (c *ApiController) GetAdapters() {
owner := c.Input().Get("owner") owner := c.Input().Get("owner")
limit := c.Input().Get("pageSize") limit := c.Input().Get("pageSize")
page := c.Input().Get("p") page := c.Input().Get("p")
@@ -40,7 +40,7 @@ func (c *ApiController) GetCasbinAdapters() {
sortOrder := c.Input().Get("sortOrder") sortOrder := c.Input().Get("sortOrder")
if limit == "" || page == "" { if limit == "" || page == "" {
adapters, err := object.GetCasbinAdapters(owner) adapters, err := object.GetAdapters(owner)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
@@ -49,14 +49,14 @@ func (c *ApiController) GetCasbinAdapters() {
c.ResponseOk(adapters) c.ResponseOk(adapters)
} else { } else {
limit := util.ParseInt(limit) limit := util.ParseInt(limit)
count, err := object.GetCasbinAdapterCount(owner, field, value) count, err := object.GetAdapterCount(owner, field, value)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
} }
paginator := pagination.SetPaginator(c.Ctx, limit, count) 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 { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
@@ -66,17 +66,17 @@ func (c *ApiController) GetCasbinAdapters() {
} }
} }
// GetCasbinAdapter // GetAdapter
// @Title GetCasbinAdapter // @Title GetAdapter
// @Tag Adapter API // @Tag Adapter API
// @Description get adapter // @Description get adapter
// @Param id query string true "The id ( owner/name ) of the adapter" // @Param id query string true "The id ( owner/name ) of the adapter"
// @Success 200 {object} object.Adapter The Response object // @Success 200 {object} object.Adapter The Response object
// @router /get-adapter [get] // @router /get-adapter [get]
func (c *ApiController) GetCasbinAdapter() { func (c *ApiController) GetAdapter() {
id := c.Input().Get("id") id := c.Input().Get("id")
adapter, err := object.GetCasbinAdapter(id) adapter, err := object.GetAdapter(id)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
@@ -85,75 +85,75 @@ func (c *ApiController) GetCasbinAdapter() {
c.ResponseOk(adapter) c.ResponseOk(adapter)
} }
// UpdateCasbinAdapter // UpdateAdapter
// @Title UpdateCasbinAdapter // @Title UpdateAdapter
// @Tag Adapter API // @Tag Adapter API
// @Description update adapter // @Description update adapter
// @Param id query string true "The id ( owner/name ) of the adapter" // @Param id query string true "The id ( owner/name ) of the adapter"
// @Param body body object.Adapter true "The details of the adapter" // @Param body body object.Adapter true "The details of the adapter"
// @Success 200 {object} controllers.Response The Response object // @Success 200 {object} controllers.Response The Response object
// @router /update-adapter [post] // @router /update-adapter [post]
func (c *ApiController) UpdateCasbinAdapter() { func (c *ApiController) UpdateAdapter() {
id := c.Input().Get("id") id := c.Input().Get("id")
var casbinAdapter object.CasbinAdapter var adapter object.Adapter
err := json.Unmarshal(c.Ctx.Input.RequestBody, &casbinAdapter) err := json.Unmarshal(c.Ctx.Input.RequestBody, &adapter)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
} }
c.Data["json"] = wrapActionResponse(object.UpdateCasbinAdapter(id, &casbinAdapter)) c.Data["json"] = wrapActionResponse(object.UpdateAdapter(id, &adapter))
c.ServeJSON() c.ServeJSON()
} }
// AddCasbinAdapter // AddAdapter
// @Title AddCasbinAdapter // @Title AddAdapter
// @Tag Adapter API // @Tag Adapter API
// @Description add adapter // @Description add adapter
// @Param body body object.Adapter true "The details of the adapter" // @Param body body object.Adapter true "The details of the adapter"
// @Success 200 {object} controllers.Response The Response object // @Success 200 {object} controllers.Response The Response object
// @router /add-adapter [post] // @router /add-adapter [post]
func (c *ApiController) AddCasbinAdapter() { func (c *ApiController) AddAdapter() {
var casbinAdapter object.CasbinAdapter var adapter object.Adapter
err := json.Unmarshal(c.Ctx.Input.RequestBody, &casbinAdapter) err := json.Unmarshal(c.Ctx.Input.RequestBody, &adapter)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
} }
c.Data["json"] = wrapActionResponse(object.AddCasbinAdapter(&casbinAdapter)) c.Data["json"] = wrapActionResponse(object.AddAdapter(&adapter))
c.ServeJSON() c.ServeJSON()
} }
// DeleteCasbinAdapter // DeleteAdapter
// @Title DeleteCasbinAdapter // @Title DeleteAdapter
// @Tag Adapter API // @Tag Adapter API
// @Description delete adapter // @Description delete adapter
// @Param body body object.Adapter true "The details of the adapter" // @Param body body object.Adapter true "The details of the adapter"
// @Success 200 {object} controllers.Response The Response object // @Success 200 {object} controllers.Response The Response object
// @router /delete-adapter [post] // @router /delete-adapter [post]
func (c *ApiController) DeleteCasbinAdapter() { func (c *ApiController) DeleteAdapter() {
var casbinAdapter object.CasbinAdapter var adapter object.Adapter
err := json.Unmarshal(c.Ctx.Input.RequestBody, &casbinAdapter) err := json.Unmarshal(c.Ctx.Input.RequestBody, &adapter)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
} }
c.Data["json"] = wrapActionResponse(object.DeleteCasbinAdapter(&casbinAdapter)) c.Data["json"] = wrapActionResponse(object.DeleteAdapter(&adapter))
c.ServeJSON() c.ServeJSON()
} }
func (c *ApiController) SyncPolicies() { func (c *ApiController) GetPolicies() {
id := c.Input().Get("id") id := c.Input().Get("id")
adapter, err := object.GetCasbinAdapter(id) adapter, err := object.GetAdapter(id)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
} }
policies, err := object.SyncPolicies(adapter) policies, err := object.GetPolicies(adapter)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
@@ -164,7 +164,7 @@ func (c *ApiController) SyncPolicies() {
func (c *ApiController) UpdatePolicy() { func (c *ApiController) UpdatePolicy() {
id := c.Input().Get("id") id := c.Input().Get("id")
adapter, err := object.GetCasbinAdapter(id) adapter, err := object.GetAdapter(id)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
@@ -188,7 +188,7 @@ func (c *ApiController) UpdatePolicy() {
func (c *ApiController) AddPolicy() { func (c *ApiController) AddPolicy() {
id := c.Input().Get("id") id := c.Input().Get("id")
adapter, err := object.GetCasbinAdapter(id) adapter, err := object.GetAdapter(id)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
@@ -212,7 +212,7 @@ func (c *ApiController) AddPolicy() {
func (c *ApiController) RemovePolicy() { func (c *ApiController) RemovePolicy() {
id := c.Input().Get("id") id := c.Input().Get("id")
adapter, err := object.GetCasbinAdapter(id) adapter, err := object.GetAdapter(id)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return

View File

@@ -61,7 +61,7 @@ func (c *ApiController) GetEnforcers() {
return return
} }
c.ResponseOk(enforcers) c.ResponseOk(enforcers, paginator.Nums())
} }
} }

View File

@@ -31,7 +31,6 @@ import (
// @router /get-payments [get] // @router /get-payments [get]
func (c *ApiController) GetPayments() { func (c *ApiController) GetPayments() {
owner := c.Input().Get("owner") owner := c.Input().Get("owner")
organization := c.Input().Get("organization")
limit := c.Input().Get("pageSize") limit := c.Input().Get("pageSize")
page := c.Input().Get("p") page := c.Input().Get("p")
field := c.Input().Get("field") field := c.Input().Get("field")
@@ -49,14 +48,14 @@ func (c *ApiController) GetPayments() {
c.ResponseOk(payments) c.ResponseOk(payments)
} else { } else {
limit := util.ParseInt(limit) limit := util.ParseInt(limit)
count, err := object.GetPaymentCount(owner, organization, field, value) count, err := object.GetPaymentCount(owner, field, value)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
} }
paginator := pagination.SetPaginator(c.Ctx, limit, count) paginator := pagination.SetPaginator(c.Ctx, limit, count)
payments, err := object.GetPaginationPayments(owner, organization, paginator.Offset(), limit, field, value, sortField, sortOrder) payments, err := object.GetPaginationPayments(owner, paginator.Offset(), limit, field, value, sortField, sortOrder)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
@@ -77,10 +76,9 @@ func (c *ApiController) GetPayments() {
// @router /get-user-payments [get] // @router /get-user-payments [get]
func (c *ApiController) GetUserPayments() { func (c *ApiController) GetUserPayments() {
owner := c.Input().Get("owner") owner := c.Input().Get("owner")
organization := c.Input().Get("organization")
user := c.Input().Get("user") user := c.Input().Get("user")
payments, err := object.GetUserPayments(owner, organization, user) payments, err := object.GetUserPayments(owner, user)
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
@@ -177,24 +175,18 @@ func (c *ApiController) DeletePayment() {
// @router /notify-payment [post] // @router /notify-payment [post]
func (c *ApiController) NotifyPayment() { func (c *ApiController) NotifyPayment() {
owner := c.Ctx.Input.Param(":owner") owner := c.Ctx.Input.Param(":owner")
providerName := c.Ctx.Input.Param(":provider")
productName := c.Ctx.Input.Param(":product")
paymentName := c.Ctx.Input.Param(":payment") paymentName := c.Ctx.Input.Param(":payment")
orderId := c.Ctx.Input.Param("order") orderId := c.Ctx.Input.Param("order")
body := c.Ctx.Input.RequestBody body := c.Ctx.Input.RequestBody
err, errorResponse := object.NotifyPayment(c.Ctx.Request, body, owner, providerName, productName, paymentName, orderId) payment, err := object.NotifyPayment(c.Ctx.Request, body, owner, paymentName, orderId)
_, err2 := c.Ctx.ResponseWriter.Write([]byte(errorResponse))
if err2 != nil {
panic(err2)
}
if err != nil { if err != nil {
c.ResponseError(err.Error()) c.ResponseError(err.Error())
return return
} }
c.ResponseOk(payment)
} }
// InvoicePayment // InvoicePayment

View File

@@ -48,7 +48,7 @@ func main() {
object.InitDefaultStorageProvider() object.InitDefaultStorageProvider()
object.InitLdapAutoSynchronizer() object.InitLdapAutoSynchronizer()
proxy.InitHttpClient() proxy.InitHttpClient()
authz.InitAuthz() authz.InitApi()
util.SafeGoroutine(func() { object.RunSyncUsersJob() }) util.SafeGoroutine(func() { object.RunSyncUsersJob() })
@@ -62,7 +62,7 @@ func main() {
beego.InsertFilter("*", beego.BeforeRouter, routers.StaticFilter) beego.InsertFilter("*", beego.BeforeRouter, routers.StaticFilter)
beego.InsertFilter("*", beego.BeforeRouter, routers.AutoSigninFilter) beego.InsertFilter("*", beego.BeforeRouter, routers.AutoSigninFilter)
beego.InsertFilter("*", beego.BeforeRouter, routers.CorsFilter) 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.PrometheusFilter)
beego.InsertFilter("*", beego.BeforeRouter, routers.RecordMessage) beego.InsertFilter("*", beego.BeforeRouter, routers.RecordMessage)

View File

@@ -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"); // Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License. // you may not use this file except in compliance with the License.
@@ -15,365 +15,311 @@
package object package object
import ( import (
"database/sql"
"fmt" "fmt"
"runtime"
"strings" "strings"
"github.com/beego/beego" "github.com/casbin/casbin/v2/model"
"github.com/casdoor/casdoor/conf" "github.com/casdoor/casdoor/conf"
"github.com/casdoor/casdoor/util" "github.com/casdoor/casdoor/util"
xormadapter "github.com/casdoor/xorm-adapter/v3" 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/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 { type Adapter struct {
driverName string Owner string `xorm:"varchar(100) notnull pk" json:"owner"`
dataSourceName string Name string `xorm:"varchar(100) notnull pk" json:"name"`
dbName string CreatedTime string `xorm:"varchar(100)" json:"createdTime"`
Engine *xorm.Engine
Type string `xorm:"varchar(100)" json:"type"`
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"`
*xormadapter.Adapter `xorm:"-" json:"-"`
} }
// finalizer is the destructor for Adapter. func GetAdapterCount(owner, field, value string) (int64, error) {
func finalizer(a *Adapter) { session := GetSession(owner, -1, -1, field, value, "", "")
err := a.Engine.Close() 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 { 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 GetAdapter(id string) (*Adapter, error) {
func NewAdapter(driverName string, dataSourceName string, dbName string) *Adapter { owner, name := util.GetOwnerAndNameFromId(id)
a := &Adapter{} return getAdapter(owner, name)
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 { func UpdateAdapter(id string, adapter *Adapter) (bool, error) {
if driverName == "postgres" { owner, name := util.GetOwnerAndNameFromId(id)
db, err := sql.Open(driverName, dataSourceName) if adapter, err := getAdapter(owner, name); adapter == nil {
return false, err
}
if name != adapter.Name {
err := adapterChangeTrigger(name, adapter.Name)
if err != nil {
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 (adapter *Adapter) initAdapter() error {
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 fmt.Errorf("unsupported database type: %s", adapter.DatabaseType)
}
}
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 { if err != nil {
return err 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
} }
return nil
} }
func (a *Adapter) CreateDatabase() error { func adapterChangeTrigger(oldName string, newName string) error {
if a.driverName == "postgres" { session := ormer.Engine.NewSession()
return nil defer session.Close()
}
engine, err := xorm.NewEngine(a.driverName, a.dataSourceName) err := session.Begin()
if err != nil { if err != nil {
return err 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)) enforcer := new(Enforcer)
return err enforcer.Adapter = newName
_, err = session.Where("adapter=?", oldName).Update(enforcer)
if err != nil {
session.Rollback()
return err
}
return session.Commit()
} }
func (a *Adapter) open() { func safeReturn(policy []string, i int) string {
dataSourceName := a.dataSourceName + a.dbName if len(policy) > i {
if a.driverName != "mysql" { return policy[i]
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))
} else { } else {
session = session.Desc(util.SnakeString(sortField)) return ""
} }
return session
} }
func GetSessionForUser(owner string, offset, limit int, field, value, sortField, sortOrder string) *xorm.Session { func matrixToCasbinRules(Ptype string, policies [][]string) []*xormadapter.CasbinRule {
session := adapter.Engine.Prepare() res := []*xormadapter.CasbinRule{}
if offset != -1 && limit != -1 {
session.Limit(limit, offset) for _, policy := range policies {
} line := xormadapter.CasbinRule{
if owner != "" { Ptype: Ptype,
if offset == -1 { V0: safeReturn(policy, 0),
session = session.And("owner=?", owner) V1: safeReturn(policy, 1),
} else { V2: safeReturn(policy, 2),
session = session.And("a.owner=?", owner) V3: safeReturn(policy, 3),
V4: safeReturn(policy, 4),
V5: safeReturn(policy, 5),
} }
} res = append(res, &line)
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") return res
tableName := tableNamePrefix + "user" }
if offset == -1 {
if sortOrder == "ascend" { func GetPolicies(adapter *Adapter) ([]*xormadapter.CasbinRule, error) {
session = session.Asc(util.SnakeString(sortField)) err := adapter.initAdapter()
} else { if err != nil {
session = session.Desc(util.SnakeString(sortField)) return nil, err
} }
} else {
if sortOrder == "ascend" { casbinModel := getModelDef()
session = session.Alias("a"). err = adapter.LoadPolicy(casbinModel)
Join("INNER", []string{tableName, "b"}, "a.owner = b.owner and a.name = b.name"). if err != nil {
Select("b.*"). return nil, err
Asc("a." + util.SnakeString(sortField)) }
} else {
session = session.Alias("a"). policies := matrixToCasbinRules("p", casbinModel.GetPolicy("p", "p"))
Join("INNER", []string{tableName, "b"}, "a.owner = b.owner and a.name = b.name"). policies = append(policies, matrixToCasbinRules("g", casbinModel.GetPolicy("g", "g"))...)
Select("b.*"). return policies, nil
Desc("a." + util.SnakeString(sortField)) }
}
} func UpdatePolicy(oldPolicy, newPolicy []string, adapter *Adapter) (bool, error) {
err := adapter.initAdapter()
return session if err != nil {
return false, err
}
casbinModel := getModelDef()
err = adapter.LoadPolicy(casbinModel)
if err != nil {
return false, err
}
affected := casbinModel.UpdatePolicy("p", "p", oldPolicy, newPolicy)
if err != nil {
return affected, err
}
return affected, nil
}
func AddPolicy(policy []string, adapter *Adapter) (bool, error) {
err := adapter.initAdapter()
if err != nil {
return false, err
}
casbinModel := getModelDef()
err = adapter.LoadPolicy(casbinModel)
if err != nil {
return false, err
}
casbinModel.AddPolicy("p", "p", policy)
return true, nil
}
func RemovePolicy(policy []string, adapter *Adapter) (bool, error) {
err := adapter.initAdapter()
if err != nil {
return false, err
}
casbinModel := getModelDef()
err = adapter.LoadPolicy(casbinModel)
if err != nil {
return false, err
}
affected := casbinModel.RemovePolicy("p", "p", 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"
}
func getModelDef() model.Model {
casbinModel := model.NewModel()
casbinModel.AddDef("p", "p", "_, _, _, _, _, _")
casbinModel.AddDef("g", "g", "_, _, _, _, _, _")
return casbinModel
} }

View File

@@ -92,7 +92,7 @@ func GetOrganizationApplicationCount(owner, Organization, field, value string) (
func GetApplications(owner string) ([]*Application, error) { func GetApplications(owner string) ([]*Application, error) {
applications := []*Application{} 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 { if err != nil {
return applications, err return applications, err
} }
@@ -102,7 +102,7 @@ func GetApplications(owner string) ([]*Application, error) {
func GetOrganizationApplications(owner string, organization string) ([]*Application, error) { func GetOrganizationApplications(owner string, organization string) ([]*Application, error) {
applications := []*Application{} 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 { if err != nil {
return applications, err return applications, err
} }
@@ -182,7 +182,7 @@ func getApplication(owner string, name string) (*Application, error) {
} }
application := Application{Owner: owner, Name: name} application := Application{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&application) existed, err := ormer.Engine.Get(&application)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -206,7 +206,7 @@ func getApplication(owner string, name string) (*Application, error) {
func GetApplicationByOrganizationName(organization string) (*Application, error) { func GetApplicationByOrganizationName(organization string) (*Application, error) {
application := Application{} application := Application{}
existed, err := adapter.Engine.Where("organization=?", organization).Get(&application) existed, err := ormer.Engine.Where("organization=?", organization).Get(&application)
if err != nil { if err != nil {
return nil, nil return nil, nil
} }
@@ -253,7 +253,7 @@ func GetApplicationByUserId(userId string) (application *Application, err error)
func GetApplicationByClientId(clientId string) (*Application, error) { func GetApplicationByClientId(clientId string) (*Application, error) {
application := Application{} 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 { if err != nil {
return nil, err return nil, err
} }
@@ -356,7 +356,7 @@ func UpdateApplication(id string, application *Application) (bool, error) {
providerItem.Provider = nil providerItem.Provider = nil
} }
session := adapter.Engine.ID(core.PK{owner, name}).AllCols() session := ormer.Engine.ID(core.PK{owner, name}).AllCols()
if application.ClientSecret == "***" { if application.ClientSecret == "***" {
session.Omit("client_secret") session.Omit("client_secret")
} }
@@ -395,7 +395,7 @@ func AddApplication(application *Application) (bool, error) {
providerItem.Provider = nil providerItem.Provider = nil
} }
affected, err := adapter.Engine.Insert(application) affected, err := ormer.Engine.Insert(application)
if err != nil { if err != nil {
return false, nil return false, nil
} }
@@ -408,7 +408,7 @@ func DeleteApplication(application *Application) (bool, error) {
return false, nil 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 { if err != nil {
return false, err return false, err
} }
@@ -484,7 +484,7 @@ func ExtendManagedAccountsWithUser(user *User) (*User, error) {
} }
func applicationChangeTrigger(oldName string, newName string) error { func applicationChangeTrigger(oldName string, newName string) error {
session := adapter.Engine.NewSession() session := ormer.Engine.NewSession()
defer session.Close() defer session.Close()
err := session.Begin() err := session.Begin()
@@ -514,7 +514,7 @@ func applicationChangeTrigger(oldName string, newName string) error {
} }
var permissions []*Permission var permissions []*Permission
err = adapter.Engine.Find(&permissions) err = ormer.Engine.Find(&permissions)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -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
}

View File

@@ -65,7 +65,7 @@ func GetCertCount(owner, field, value string) (int64, error) {
func GetCerts(owner string) ([]*Cert, error) { func GetCerts(owner string) ([]*Cert, error) {
certs := []*Cert{} 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 { if err != nil {
return certs, err return certs, err
} }
@@ -91,7 +91,7 @@ func GetGlobalCertsCount(field, value string) (int64, error) {
func GetGlobleCerts() ([]*Cert, error) { func GetGlobleCerts() ([]*Cert, error) {
certs := []*Cert{} certs := []*Cert{}
err := adapter.Engine.Desc("created_time").Find(&certs) err := ormer.Engine.Desc("created_time").Find(&certs)
if err != nil { if err != nil {
return certs, err return certs, err
} }
@@ -116,7 +116,7 @@ func getCert(owner string, name string) (*Cert, error) {
} }
cert := Cert{Owner: owner, Name: name} cert := Cert{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&cert) existed, err := ormer.Engine.Get(&cert)
if err != nil { if err != nil {
return &cert, err return &cert, err
} }
@@ -134,7 +134,7 @@ func getCertByName(name string) (*Cert, error) {
} }
cert := Cert{Name: name} cert := Cert{Name: name}
existed, err := adapter.Engine.Get(&cert) existed, err := ormer.Engine.Get(&cert)
if err != nil { if err != nil {
return &cert, nil return &cert, nil
} }
@@ -165,7 +165,7 @@ func UpdateCert(id string, cert *Cert) (bool, error) {
return false, nil 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 { if err != nil {
return false, err return false, err
} }
@@ -180,7 +180,7 @@ func AddCert(cert *Cert) (bool, error) {
cert.PrivateKey = privateKey cert.PrivateKey = privateKey
} }
affected, err := adapter.Engine.Insert(cert) affected, err := ormer.Engine.Insert(cert)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -189,7 +189,7 @@ func AddCert(cert *Cert) (bool, error) {
} }
func DeleteCert(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 { if err != nil {
return false, err return false, err
} }
@@ -214,7 +214,7 @@ func GetDefaultCert() (*Cert, error) {
} }
func certChangeTrigger(oldName string, newName string) error { func certChangeTrigger(oldName string, newName string) error {
session := adapter.Engine.NewSession() session := ormer.Engine.NewSession()
defer session.Close() defer session.Close()
err := session.Begin() err := session.Begin()

View File

@@ -70,7 +70,7 @@ func GetChatCount(owner, field, value string) (int64, error) {
func GetChats(owner string) ([]*Chat, error) { func GetChats(owner string) ([]*Chat, error) {
chats := []*Chat{} 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 { if err != nil {
return chats, err return chats, err
} }
@@ -95,7 +95,7 @@ func getChat(owner string, name string) (*Chat, error) {
} }
chat := Chat{Owner: owner, Name: name} chat := Chat{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&chat) existed, err := ormer.Engine.Get(&chat)
if err != nil { if err != nil {
return &chat, err return &chat, err
} }
@@ -120,7 +120,7 @@ func UpdateChat(id string, chat *Chat) (bool, error) {
return false, nil 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 { if err != nil {
return false, 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 { if err != nil {
return false, nil return false, nil
} }
@@ -149,7 +149,7 @@ func AddChat(chat *Chat) (bool, error) {
} }
func DeleteChat(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 { if err != nil {
return false, err return false, err
} }

View File

@@ -15,6 +15,8 @@
package object package object
import ( import (
"errors"
"github.com/casbin/casbin/v2" "github.com/casbin/casbin/v2"
"github.com/casdoor/casdoor/util" "github.com/casdoor/casdoor/util"
"github.com/xorm-io/core" "github.com/xorm-io/core"
@@ -42,7 +44,7 @@ func GetEnforcerCount(owner, field, value string) (int64, error) {
func GetEnforcers(owner string) ([]*Enforcer, error) { func GetEnforcers(owner string) ([]*Enforcer, error) {
enforcers := []*Enforcer{} 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 { if err != nil {
return enforcers, err return enforcers, err
} }
@@ -67,7 +69,7 @@ func getEnforcer(owner string, name string) (*Enforcer, error) {
} }
enforcer := Enforcer{Owner: owner, Name: name} enforcer := Enforcer{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&enforcer) existed, err := ormer.Engine.Get(&enforcer)
if err != nil { if err != nil {
return &enforcer, err return &enforcer, err
} }
@@ -92,7 +94,7 @@ func UpdateEnforcer(id string, enforcer *Enforcer) (bool, error) {
return false, nil 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 { if err != nil {
return false, err return false, err
} }
@@ -101,7 +103,7 @@ func UpdateEnforcer(id string, enforcer *Enforcer) (bool, error) {
} }
func AddEnforcer(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 { if err != nil {
return false, err return false, err
} }
@@ -110,10 +112,52 @@ func AddEnforcer(enforcer *Enforcer) (bool, error) {
} }
func DeleteEnforcer(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 { if err != nil {
return false, err return false, err
} }
return affected != 0, nil 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")
}
err = m.initModel()
if err != nil {
return nil, err
}
err = a.initAdapter()
if err != nil {
return nil, err
}
e, err := casbin.NewEnforcer(m.Model, a.Adapter)
if err != nil {
return nil, err
}
return e, nil
}

View File

@@ -58,7 +58,7 @@ func GetGroupCount(owner, field, value string) (int64, error) {
func GetGroups(owner string) ([]*Group, error) { func GetGroups(owner string) ([]*Group, error) {
groups := []*Group{} 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 { if err != nil {
return nil, err return nil, err
} }
@@ -83,7 +83,7 @@ func getGroup(owner string, name string) (*Group, error) {
} }
group := Group{Owner: owner, Name: name} group := Group{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&group) existed, err := ormer.Engine.Get(&group)
if err != nil { if err != nil {
return nil, err 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 { if err != nil {
return false, err return false, err
} }
@@ -133,7 +133,7 @@ func AddGroup(group *Group) (bool, error) {
return false, err return false, err
} }
affected, err := adapter.Engine.Insert(group) affected, err := ormer.Engine.Insert(group)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -145,7 +145,7 @@ func AddGroups(groups []*Group) (bool, error) {
if len(groups) == 0 { if len(groups) == 0 {
return false, nil return false, nil
} }
affected, err := adapter.Engine.Insert(groups) affected, err := ormer.Engine.Insert(groups)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -153,12 +153,12 @@ func AddGroups(groups []*Group) (bool, error) {
} }
func DeleteGroup(group *Group) (bool, error) { func DeleteGroup(group *Group) (bool, error) {
_, err := adapter.Engine.Get(group) _, err := ormer.Engine.Get(group)
if err != nil { if err != nil {
return false, err 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 return false, err
} else if count > 0 { } else if count > 0 {
return false, errors.New("group has children group") 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") 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 { if err != nil {
return false, err return false, err
} }
@@ -179,7 +179,7 @@ func DeleteGroup(group *Group) (bool, error) {
} }
func checkGroupName(name string) 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 { if err != nil {
return err return err
} }
@@ -233,10 +233,10 @@ func RemoveUserFromGroup(owner, name, groupName string) (bool, error) {
func GetGroupUserCount(groupName string, field, value string) (int64, error) { func GetGroupUserCount(groupName string, field, value string) (int64, error) {
if field == "" && value == "" { if field == "" && value == "" {
return adapter.Engine.Where(builder.Like{"`groups`", groupName}). return ormer.Engine.Where(builder.Like{"`groups`", groupName}).
Count(&User{}) Count(&User{})
} else { } else {
return adapter.Engine.Table("user"). return ormer.Engine.Table("user").
Where(builder.Like{"`groups`", groupName}). Where(builder.Like{"`groups`", groupName}).
And(fmt.Sprintf("user.%s LIKE ?", util.CamelToSnakeCase(field)), "%"+value+"%"). And(fmt.Sprintf("user.%s LIKE ?", util.CamelToSnakeCase(field)), "%"+value+"%").
Count() 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) { func GetPaginationGroupUsers(groupName string, offset, limit int, field, value, sortField, sortOrder string) ([]*User, error) {
users := []*User{} users := []*User{}
session := adapter.Engine.Table("user"). session := ormer.Engine.Table("user").
Where(builder.Like{"`groups`", groupName + "\""}) Where(builder.Like{"`groups`", groupName + "\""})
if offset != -1 && limit != -1 { if offset != -1 && limit != -1 {
@@ -275,7 +275,7 @@ func GetPaginationGroupUsers(groupName string, offset, limit int, field, value,
func GetGroupUsers(groupName string) ([]*User, error) { func GetGroupUsers(groupName string) ([]*User, error) {
users := []*User{} users := []*User{}
err := adapter.Engine.Table("user"). err := ormer.Engine.Table("user").
Where(builder.Like{"`groups`", groupName + "\""}). Where(builder.Like{"`groups`", groupName + "\""}).
Find(&users) Find(&users)
if err != nil { if err != nil {
@@ -286,7 +286,7 @@ func GetGroupUsers(groupName string) ([]*User, error) {
} }
func GroupChangeTrigger(oldName, newName string) error { func GroupChangeTrigger(oldName, newName string) error {
session := adapter.Engine.NewSession() session := ormer.Engine.NewSession()
defer session.Close() defer session.Close()
err := session.Begin() err := session.Begin()
if err != nil { if err != nil {

View File

@@ -27,7 +27,6 @@ import (
func InitDb() { func InitDb() {
existed := initBuiltInOrganization() existed := initBuiltInOrganization()
if !existed { if !existed {
initBuiltInModel()
initBuiltInPermission() initBuiltInPermission()
initBuiltInProvider() initBuiltInProvider()
initBuiltInUser() initBuiltInUser()
@@ -36,6 +35,15 @@ func InitDb() {
initBuiltInLdap() initBuiltInLdap()
} }
existed = initBuiltInApiModel()
if !existed {
initBuildInApiAdapter()
initBuiltInApiEnforcer()
initBuiltInPermissionModel()
initBuildInPermissionAdapter()
initBuiltInPermissionEnforcer()
}
initWebAuthn() initWebAuthn()
} }
@@ -295,8 +303,8 @@ func initWebAuthn() {
gob.Register(webauthn.SessionData{}) gob.Register(webauthn.SessionData{})
} }
func initBuiltInModel() { func initBuiltInPermissionModel() {
model, err := GetModel("built-in/model-built-in") model, err := GetModel("built-in/permission-model-built-in")
if err != nil { if err != nil {
panic(err) panic(err)
} }
@@ -307,7 +315,7 @@ func initBuiltInModel() {
model = &Model{ model = &Model{
Owner: "built-in", Owner: "built-in",
Name: "model-built-in", Name: "permission-model-built-in",
CreatedTime: util.GetCurrentTime(), CreatedTime: util.GetCurrentTime(),
DisplayName: "Built-in Model", DisplayName: "Built-in Model",
IsEnabled: true, 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() { func initBuiltInPermission() {
permission, err := GetPermission("built-in/permission-built-in") permission, err := GetPermission("built-in/permission-built-in")
if err != nil { if err != nil {
@@ -358,3 +414,109 @@ func initBuiltInPermission() {
panic(err) 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)
}
}

View File

@@ -46,7 +46,7 @@ func AddLdap(ldap *Ldap) (bool, error) {
ldap.CreatedTime = util.GetCurrentTime() ldap.CreatedTime = util.GetCurrentTime()
} }
affected, err := adapter.Engine.Insert(ldap) affected, err := ormer.Engine.Insert(ldap)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -56,7 +56,7 @@ func AddLdap(ldap *Ldap) (bool, error) {
func CheckLdapExist(ldap *Ldap) (bool, error) { func CheckLdapExist(ldap *Ldap) (bool, error) {
var result []*Ldap var result []*Ldap
err := adapter.Engine.Find(&result, &Ldap{ err := ormer.Engine.Find(&result, &Ldap{
Owner: ldap.Owner, Owner: ldap.Owner,
Host: ldap.Host, Host: ldap.Host,
Port: ldap.Port, Port: ldap.Port,
@@ -77,7 +77,7 @@ func CheckLdapExist(ldap *Ldap) (bool, error) {
func GetLdaps(owner string) ([]*Ldap, error) { func GetLdaps(owner string) ([]*Ldap, error) {
var ldaps []*Ldap 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 { if err != nil {
return ldaps, err return ldaps, err
} }
@@ -91,7 +91,7 @@ func GetLdap(id string) (*Ldap, error) {
} }
ldap := Ldap{Id: id} ldap := Ldap{Id: id}
existed, err := adapter.Engine.Get(&ldap) existed, err := ormer.Engine.Get(&ldap)
if err != nil { if err != nil {
return &ldap, nil return &ldap, nil
} }
@@ -147,7 +147,7 @@ func UpdateLdap(ldap *Ldap) (bool, error) {
ldap.Password = l.Password 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) "port", "enable_ssl", "username", "password", "base_dn", "filter", "filter_fields", "auto_sync").Update(ldap)
if err != nil { if err != nil {
return false, nil return false, nil
@@ -157,7 +157,7 @@ func UpdateLdap(ldap *Ldap) (bool, error) {
} }
func DeleteLdap(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 { if err != nil {
return false, err return false, err
} }

View File

@@ -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 // start all autosync goroutine for existing ldap servers in each organizations
func (l *LdapAutoSynchronizer) LdapAutoSynchronizerStartUpAll() error { func (l *LdapAutoSynchronizer) LdapAutoSynchronizerStartUpAll() error {
organizations := []*Organization{} organizations := []*Organization{}
err := adapter.Engine.Desc("created_time").Find(&organizations) err := ormer.Engine.Desc("created_time").Find(&organizations)
if err != nil { if err != nil {
logs.Info("failed to Star up LdapAutoSynchronizer; ") logs.Info("failed to Star up LdapAutoSynchronizer; ")
} }
@@ -141,7 +141,7 @@ func (l *LdapAutoSynchronizer) LdapAutoSynchronizerStartUpAll() error {
} }
func UpdateLdapSyncTime(ldapId string) 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 { if err != nil {
return err return err
} }

View File

@@ -338,7 +338,7 @@ func SyncLdapUsers(owner string, syncUsers []LdapUser, ldapId string) (existUser
func GetExistUuids(owner string, uuids []string) ([]string, error) { func GetExistUuids(owner string, uuids []string) ([]string, error) {
var existUuids []string 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) In("ldap", uuids).Select("DISTINCT ldap").Find(&existUuids)
if err != nil { if err != nil {
return existUuids, err return existUuids, err
@@ -350,7 +350,7 @@ func GetExistUuids(owner string, uuids []string) ([]string, error) {
func (ldapUser *LdapUser) buildLdapUserName() (string, error) { func (ldapUser *LdapUser) buildLdapUserName() (string, error) {
user := User{} user := User{}
uidWithNumber := fmt.Sprintf("%s_%s", ldapUser.Uid, ldapUser.UidNumber) 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 { if err != nil {
return "", err return "", err
} }

View File

@@ -55,13 +55,13 @@ func GetMessageCount(owner, organization, field, value string) (int64, error) {
func GetMessages(owner string) ([]*Message, error) { func GetMessages(owner string) ([]*Message, error) {
messages := []*Message{} 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 return messages, err
} }
func GetChatMessages(chat string) ([]*Message, error) { func GetChatMessages(chat string) ([]*Message, error) {
messages := []*Message{} 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 return messages, err
} }
@@ -78,7 +78,7 @@ func getMessage(owner string, name string) (*Message, error) {
} }
message := Message{Owner: owner, Name: name} message := Message{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&message) existed, err := ormer.Engine.Get(&message)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -103,7 +103,7 @@ func UpdateMessage(id string, message *Message) (bool, error) {
return false, nil 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 { if err != nil {
return false, err return false, err
} }
@@ -112,7 +112,7 @@ func UpdateMessage(id string, message *Message) (bool, error) {
} }
func AddMessage(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 { if err != nil {
return false, err return false, err
} }
@@ -121,7 +121,7 @@ func AddMessage(message *Message) (bool, error) {
} }
func DeleteMessage(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 { if err != nil {
return false, err return false, err
} }
@@ -130,7 +130,7 @@ func DeleteMessage(message *Message) (bool, error) {
} }
func DeleteChatMessages(chat string) (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 { if err != nil {
return false, err return false, err
} }

View File

@@ -43,7 +43,7 @@ func DoMigration() {
IDColumnName: "id", IDColumnName: "id",
} }
m := migrate.New(adapter.Engine, options, migrations) m := migrate.New(ormer.Engine, options, migrations)
err := m.Migrate() err := m.Migrate()
if err != nil { if err != nil {
panic(err) panic(err)

View File

@@ -24,9 +24,9 @@ import (
type Migrator_1_101_0_PR_1083 struct{} type Migrator_1_101_0_PR_1083 struct{}
func (*Migrator_1_101_0_PR_1083) IsMigrationNeeded() bool { func (*Migrator_1_101_0_PR_1083) IsMigrationNeeded() bool {
exist1, _ := adapter.Engine.IsTableExist("model") exist1, _ := ormer.Engine.IsTableExist("model")
exist2, _ := adapter.Engine.IsTableExist("permission") exist2, _ := ormer.Engine.IsTableExist("permission")
exist3, _ := adapter.Engine.IsTableExist("permission_rule") exist3, _ := ormer.Engine.IsTableExist("permission_rule")
if exist1 && exist2 && exist3 { if exist1 && exist2 && exist3 {
return true return true

View File

@@ -23,7 +23,7 @@ import (
type Migrator_1_235_0_PR_1530 struct{} type Migrator_1_235_0_PR_1530 struct{}
func (*Migrator_1_235_0_PR_1530) IsMigrationNeeded() bool { func (*Migrator_1_235_0_PR_1530) IsMigrationNeeded() bool {
exist, _ := adapter.Engine.IsTableExist("casbin_rule") exist, _ := ormer.Engine.IsTableExist("casbin_rule")
return exist return exist
} }

View File

@@ -24,8 +24,8 @@ import (
type Migrator_1_240_0_PR_1539 struct{} type Migrator_1_240_0_PR_1539 struct{}
func (*Migrator_1_240_0_PR_1539) IsMigrationNeeded() bool { func (*Migrator_1_240_0_PR_1539) IsMigrationNeeded() bool {
exist, _ := adapter.Engine.IsTableExist("session") exist, _ := ormer.Engine.IsTableExist("session")
err := adapter.Engine.Table("session").Find(&[]*Session{}) err := ormer.Engine.Table("session").Find(&[]*Session{})
if exist && err != nil { if exist && err != nil {
return true return true

View File

@@ -22,7 +22,7 @@ import (
type Migrator_1_314_0_PR_1841 struct{} type Migrator_1_314_0_PR_1841 struct{}
func (*Migrator_1_314_0_PR_1841) IsMigrationNeeded() bool { 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 { if err != nil {
// table doesn't exist // table doesn't exist
return false return false

View File

@@ -31,6 +31,8 @@ type Model struct {
ModelText string `xorm:"mediumtext" json:"modelText"` ModelText string `xorm:"mediumtext" json:"modelText"`
IsEnabled bool `json:"isEnabled"` IsEnabled bool `json:"isEnabled"`
model.Model `xorm:"-" json:"-"`
} }
func GetModelCount(owner, field, value string) (int64, error) { func GetModelCount(owner, field, value string) (int64, error) {
@@ -40,7 +42,7 @@ func GetModelCount(owner, field, value string) (int64, error) {
func GetModels(owner string) ([]*Model, error) { func GetModels(owner string) ([]*Model, error) {
models := []*Model{} 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 { if err != nil {
return models, err return models, err
} }
@@ -65,7 +67,7 @@ func getModel(owner string, name string) (*Model, error) {
} }
m := Model{Owner: owner, Name: name} m := Model{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&m) existed, err := ormer.Engine.Get(&m)
if err != nil { if err != nil {
return &m, err return &m, err
} }
@@ -111,7 +113,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 { if err != nil {
return false, err return false, err
} }
@@ -120,7 +122,7 @@ func UpdateModel(id string, modelObj *Model) (bool, error) {
} }
func AddModel(model *Model) (bool, error) { func AddModel(model *Model) (bool, error) {
affected, err := adapter.Engine.Insert(model) affected, err := ormer.Engine.Insert(model)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -129,7 +131,7 @@ func AddModel(model *Model) (bool, error) {
} }
func DeleteModel(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 { if err != nil {
return false, err return false, err
} }
@@ -137,12 +139,12 @@ func DeleteModel(model *Model) (bool, error) {
return affected != 0, nil return affected != 0, nil
} }
func (model *Model) GetId() string { func (m *Model) GetId() string {
return fmt.Sprintf("%s/%s", model.Owner, model.Name) return fmt.Sprintf("%s/%s", m.Owner, m.Name)
} }
func modelChangeTrigger(oldName string, newName string) error { func modelChangeTrigger(oldName string, newName string) error {
session := adapter.Engine.NewSession() session := ormer.Engine.NewSession()
defer session.Close() defer session.Close()
err := session.Begin() err := session.Begin()
@@ -175,3 +177,15 @@ func HasRoleDefinition(m model.Model) bool {
} }
return m["g"] != nil return m["g"] != nil
} }
func (m *Model) initModel() error {
if m.Model == nil {
casbinModel, err := model.NewModelFromString(m.ModelText)
if err != nil {
return err
}
m.Model = casbinModel
}
return nil
}

View File

@@ -80,12 +80,12 @@ func GetOrganizationCount(owner, field, value string) (int64, error) {
func GetOrganizations(owner string, name ...string) ([]*Organization, error) { func GetOrganizations(owner string, name ...string) ([]*Organization, error) {
organizations := []*Organization{} organizations := []*Organization{}
if name != nil && len(name) > 0 { 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 { if err != nil {
return nil, err return nil, err
} }
} else { } 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 { if err != nil {
return nil, err return nil, err
} }
@@ -96,7 +96,7 @@ func GetOrganizations(owner string, name ...string) ([]*Organization, error) {
func GetOrganizationsByFields(owner string, fields ...string) ([]*Organization, error) { func GetOrganizationsByFields(owner string, fields ...string) ([]*Organization, error) {
organizations := []*Organization{} 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 { if err != nil {
return nil, err return nil, err
} }
@@ -126,7 +126,7 @@ func getOrganization(owner string, name string) (*Organization, error) {
} }
organization := Organization{Owner: owner, Name: name} organization := Organization{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&organization) existed, err := ormer.Engine.Get(&organization)
if err != nil { if err != nil {
return nil, err 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 == "***" { if organization.MasterPassword == "***" {
session.Omit("master_password") session.Omit("master_password")
} }
@@ -214,7 +214,7 @@ func UpdateOrganization(id string, organization *Organization) (bool, error) {
} }
func AddOrganization(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 { if err != nil {
return false, err return false, err
} }
@@ -227,7 +227,7 @@ func DeleteOrganization(organization *Organization) (bool, error) {
return false, nil 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 { if err != nil {
return false, err return false, err
} }
@@ -299,7 +299,7 @@ func GetDefaultApplication(id string) (*Application, error) {
} }
applications := []*Application{} 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 { if err != nil {
return nil, err return nil, err
} }
@@ -330,7 +330,7 @@ func GetDefaultApplication(id string) (*Application, error) {
} }
func organizationChangeTrigger(oldName string, newName string) error { func organizationChangeTrigger(oldName string, newName string) error {
session := adapter.Engine.NewSession() session := ormer.Engine.NewSession()
defer session.Close() defer session.Close()
err := session.Begin() err := session.Begin()
@@ -360,7 +360,7 @@ func organizationChangeTrigger(oldName string, newName string) error {
} }
role := new(Role) role := new(Role)
_, err = adapter.Engine.Where("owner=?", oldName).Get(role) _, err = ormer.Engine.Where("owner=?", oldName).Get(role)
if err != nil { if err != nil {
return err return err
} }
@@ -385,7 +385,7 @@ func organizationChangeTrigger(oldName string, newName string) error {
} }
permission := new(Permission) permission := new(Permission)
_, err = adapter.Engine.Where("owner=?", oldName).Get(permission) _, err = ormer.Engine.Where("owner=?", oldName).Get(permission)
if err != nil { if err != nil {
return err return err
} }
@@ -409,9 +409,9 @@ func organizationChangeTrigger(oldName string, newName string) error {
return err return err
} }
casbinAdapter := new(CasbinAdapter) adapter := new(Adapter)
casbinAdapter.Owner = newName adapter.Owner = newName
_, err = session.Where("owner=?", oldName).Update(casbinAdapter) _, err = session.Where("owner=?", oldName).Update(adapter)
if err != nil { if err != nil {
return err return err
} }
@@ -431,7 +431,7 @@ func organizationChangeTrigger(oldName string, newName string) error {
} }
payment := new(Payment) payment := new(Payment)
payment.Organization = newName payment.Owner = newName
_, err = session.Where("organization=?", oldName).Update(payment) _, err = session.Where("organization=?", oldName).Update(payment)
if err != nil { if err != nil {
return err return err

379
object/ormer.go Normal file
View File

@@ -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
}

View File

@@ -18,6 +18,8 @@ import (
"fmt" "fmt"
"net/http" "net/http"
"github.com/casdoor/casdoor/pp"
"github.com/casdoor/casdoor/util" "github.com/casdoor/casdoor/util"
"github.com/xorm-io/core" "github.com/xorm-io/core"
) )
@@ -27,43 +29,44 @@ type Payment struct {
Name string `xorm:"varchar(100) notnull pk" json:"name"` Name string `xorm:"varchar(100) notnull pk" json:"name"`
CreatedTime string `xorm:"varchar(100)" json:"createdTime"` CreatedTime string `xorm:"varchar(100)" json:"createdTime"`
DisplayName string `xorm:"varchar(100)" json:"displayName"` DisplayName string `xorm:"varchar(100)" json:"displayName"`
// Payment Provider Info
Provider string `xorm:"varchar(100)" json:"provider"` Provider string `xorm:"varchar(100)" json:"provider"`
Type string `xorm:"varchar(100)" json:"type"` Type string `xorm:"varchar(100)" json:"type"`
Organization string `xorm:"varchar(100)" json:"organization"` // Product Info
User string `xorm:"varchar(100)" json:"user"` ProductName string `xorm:"varchar(100)" json:"productName"`
ProductName string `xorm:"varchar(100)" json:"productName"` ProductDisplayName string `xorm:"varchar(100)" json:"productDisplayName"`
ProductDisplayName string `xorm:"varchar(100)" json:"productDisplayName"` Detail string `xorm:"varchar(255)" json:"detail"`
Tag string `xorm:"varchar(100)" json:"tag"`
Detail string `xorm:"varchar(255)" json:"detail"` Currency string `xorm:"varchar(100)" json:"currency"`
Tag string `xorm:"varchar(100)" json:"tag"` Price float64 `json:"price"`
Currency string `xorm:"varchar(100)" json:"currency"` ReturnUrl string `xorm:"varchar(1000)" json:"returnUrl"`
Price float64 `json:"price"` // Payer Info
User string `xorm:"varchar(100)" json:"user"`
PayUrl string `xorm:"varchar(2000)" json:"payUrl"` PersonName string `xorm:"varchar(100)" json:"personName"`
ReturnUrl string `xorm:"varchar(1000)" json:"returnUrl"` PersonIdCard string `xorm:"varchar(100)" json:"personIdCard"`
State string `xorm:"varchar(100)" json:"state"` PersonEmail string `xorm:"varchar(100)" json:"personEmail"`
Message string `xorm:"varchar(2000)" json:"message"` PersonPhone string `xorm:"varchar(100)" json:"personPhone"`
// Invoice Info
PersonName string `xorm:"varchar(100)" json:"personName"`
PersonIdCard string `xorm:"varchar(100)" json:"personIdCard"`
PersonEmail string `xorm:"varchar(100)" json:"personEmail"`
PersonPhone string `xorm:"varchar(100)" json:"personPhone"`
InvoiceType string `xorm:"varchar(100)" json:"invoiceType"` InvoiceType string `xorm:"varchar(100)" json:"invoiceType"`
InvoiceTitle string `xorm:"varchar(100)" json:"invoiceTitle"` InvoiceTitle string `xorm:"varchar(100)" json:"invoiceTitle"`
InvoiceTaxId string `xorm:"varchar(100)" json:"invoiceTaxId"` InvoiceTaxId string `xorm:"varchar(100)" json:"invoiceTaxId"`
InvoiceRemark string `xorm:"varchar(100)" json:"invoiceRemark"` InvoiceRemark string `xorm:"varchar(100)" json:"invoiceRemark"`
InvoiceUrl string `xorm:"varchar(255)" json:"invoiceUrl"` InvoiceUrl string `xorm:"varchar(255)" json:"invoiceUrl"`
// Order Info
OutOrderId string `xorm:"varchar(100)" json:"outOrderId"`
PayUrl string `xorm:"varchar(2000)" json:"payUrl"`
State pp.PaymentState `xorm:"varchar(100)" json:"state"`
Message string `xorm:"varchar(2000)" json:"message"`
} }
func GetPaymentCount(owner, organization, field, value string) (int64, error) { func GetPaymentCount(owner, field, value string) (int64, error) {
session := GetSession(owner, -1, -1, field, value, "", "") session := GetSession(owner, -1, -1, field, value, "", "")
return session.Count(&Payment{Organization: organization}) return session.Count(&Payment{Owner: owner})
} }
func GetPayments(owner string) ([]*Payment, error) { func GetPayments(owner string) ([]*Payment, error) {
payments := []*Payment{} 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 { if err != nil {
return nil, err return nil, err
} }
@@ -71,9 +74,9 @@ func GetPayments(owner string) ([]*Payment, error) {
return payments, nil return payments, nil
} }
func GetUserPayments(owner string, organization string, user string) ([]*Payment, error) { func GetUserPayments(owner, user string) ([]*Payment, error) {
payments := []*Payment{} 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, User: user})
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -81,10 +84,10 @@ func GetUserPayments(owner string, organization string, user string) ([]*Payment
return payments, nil return payments, nil
} }
func GetPaginationPayments(owner, organization string, offset, limit int, field, value, sortField, sortOrder string) ([]*Payment, error) { func GetPaginationPayments(owner string, offset, limit int, field, value, sortField, sortOrder string) ([]*Payment, error) {
payments := []*Payment{} payments := []*Payment{}
session := GetSession(owner, offset, limit, field, value, sortField, sortOrder) session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
err := session.Find(&payments, &Payment{Organization: organization}) err := session.Find(&payments, &Payment{Owner: owner})
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -98,7 +101,7 @@ func getPayment(owner string, name string) (*Payment, error) {
} }
payment := Payment{Owner: owner, Name: name} payment := Payment{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&payment) existed, err := ormer.Engine.Get(&payment)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -123,16 +126,16 @@ func UpdatePayment(id string, payment *Payment) (bool, error) {
return false, nil 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 { if err != nil {
panic(err) return false, err
} }
return affected != 0, nil return affected != 0, nil
} }
func AddPayment(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 { if err != nil {
return false, err return false, err
} }
@@ -141,7 +144,7 @@ func AddPayment(payment *Payment) (bool, error) {
} }
func DeletePayment(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 { if err != nil {
return false, err return false, err
} }
@@ -149,73 +152,72 @@ func DeletePayment(payment *Payment) (bool, error) {
return affected != 0, nil return affected != 0, nil
} }
func notifyPayment(request *http.Request, body []byte, owner string, providerName string, productName string, paymentName string, orderId string) (*Payment, error, string) { func notifyPayment(request *http.Request, body []byte, owner string, paymentName string, orderId string) (*Payment, *pp.NotifyResult, error) {
provider, err := getProvider(owner, providerName)
if err != nil {
panic(err)
}
pProvider, cert, err := provider.getPaymentProvider()
if err != nil {
panic(err)
}
payment, err := getPayment(owner, paymentName) payment, err := getPayment(owner, paymentName)
if err != nil { if err != nil {
panic(err) return nil, nil, err
} }
if payment == nil { if payment == nil {
err = fmt.Errorf("the payment: %s does not exist", paymentName) err = fmt.Errorf("the payment: %s does not exist", paymentName)
return nil, err, pProvider.GetResponseError(err) return nil, nil, err
} }
product, err := getProduct(owner, productName) provider, err := getProvider(owner, payment.Provider)
if err != nil { if err != nil {
panic(err) return nil, nil, err
}
pProvider, cert, err := provider.getPaymentProvider()
if err != nil {
return nil, nil, err
} }
product, err := getProduct(owner, payment.ProductName)
if err != nil {
return nil, nil, err
}
if product == nil { if product == nil {
err = fmt.Errorf("the product: %s does not exist", productName) err = fmt.Errorf("the product: %s does not exist", payment.ProductName)
return payment, err, pProvider.GetResponseError(err) return nil, nil, err
} }
productDisplayName, paymentName, price, productName, providerName, err := pProvider.Notify(request, body, cert.AuthorityPublicKey, orderId) if orderId == "" {
orderId = payment.OutOrderId
}
notifyResult, err := pProvider.Notify(request, body, cert.AuthorityPublicKey, orderId)
if err != nil { if err != nil {
return payment, err, pProvider.GetResponseError(err) return payment, notifyResult, err
} }
if productDisplayName != "" && productDisplayName != product.DisplayName { if notifyResult.ProductDisplayName != "" && notifyResult.ProductDisplayName != product.DisplayName {
err = fmt.Errorf("the payment's product name: %s doesn't equal to the expected product name: %s", productDisplayName, product.DisplayName) err = fmt.Errorf("the payment's product name: %s doesn't equal to the expected product name: %s", notifyResult.ProductDisplayName, product.DisplayName)
return payment, err, pProvider.GetResponseError(err) return payment, notifyResult, err
} }
if price != product.Price { if notifyResult.Price != product.Price {
err = fmt.Errorf("the payment's price: %f doesn't equal to the expected price: %f", price, product.Price) err = fmt.Errorf("the payment's price: %f doesn't equal to the expected price: %f", notifyResult.Price, product.Price)
return payment, err, pProvider.GetResponseError(err) return payment, notifyResult, err
} }
err = nil return payment, notifyResult, err
return payment, err, pProvider.GetResponseError(err)
} }
func NotifyPayment(request *http.Request, body []byte, owner string, providerName string, productName string, paymentName string, orderId string) (error, string) { func NotifyPayment(request *http.Request, body []byte, owner string, paymentName string, orderId string) (*Payment, error) {
payment, err, errorResponse := notifyPayment(request, body, owner, providerName, productName, paymentName, orderId) payment, notifyResult, err := notifyPayment(request, body, owner, paymentName, orderId)
if payment != nil { if payment != nil {
if err != nil { if err != nil {
payment.State = "Error" payment.State = pp.PaymentStateError
payment.Message = err.Error() payment.Message = err.Error()
} else { } else {
payment.State = "Paid" payment.State = notifyResult.PaymentStatus
} }
_, err = UpdatePayment(payment.GetId(), payment) _, err = UpdatePayment(payment.GetId(), payment)
if err != nil { if err != nil {
panic(err) return nil, err
} }
} }
return err, errorResponse return payment, nil
} }
func invoicePayment(payment *Payment) (string, error) { func invoicePayment(payment *Payment) (string, error) {
@@ -242,7 +244,7 @@ func invoicePayment(payment *Payment) (string, error) {
} }
func InvoicePayment(payment *Payment) (string, error) { func InvoicePayment(payment *Payment) (string, error) {
if payment.State != "Paid" { if payment.State != pp.PaymentStatePaid {
return "", fmt.Errorf("the payment state is supposed to be: \"%s\", got: \"%s\"", "Paid", payment.State) return "", fmt.Errorf("the payment state is supposed to be: \"%s\", got: \"%s\"", "Paid", payment.State)
} }

View File

@@ -74,7 +74,7 @@ func GetPermissionCount(owner, field, value string) (int64, error) {
func GetPermissions(owner string) ([]*Permission, error) { func GetPermissions(owner string) ([]*Permission, error) {
permissions := []*Permission{} 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 { if err != nil {
return permissions, err return permissions, err
} }
@@ -99,7 +99,7 @@ func getPermission(owner string, name string) (*Permission, error) {
} }
permission := Permission{Owner: owner, Name: name} permission := Permission{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&permission) existed, err := ormer.Engine.Get(&permission)
if err != nil { if err != nil {
return &permission, err return &permission, err
} }
@@ -155,7 +155,7 @@ func UpdatePermission(id string, permission *Permission) (bool, error) {
return false, nil 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 { if err != nil {
return false, err return false, err
} }
@@ -164,9 +164,9 @@ func UpdatePermission(id string, permission *Permission) (bool, error) {
removeGroupingPolicies(oldPermission) removeGroupingPolicies(oldPermission)
removePolicies(oldPermission) removePolicies(oldPermission)
if oldPermission.Adapter != "" && oldPermission.Adapter != permission.Adapter { if oldPermission.Adapter != "" && oldPermission.Adapter != permission.Adapter {
isEmpty, _ := adapter.Engine.IsTableEmpty(oldPermission.Adapter) isEmpty, _ := ormer.Engine.IsTableEmpty(oldPermission.Adapter)
if isEmpty { if isEmpty {
err = adapter.Engine.DropTables(oldPermission.Adapter) err = ormer.Engine.DropTables(oldPermission.Adapter)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -180,7 +180,7 @@ func UpdatePermission(id string, permission *Permission) (bool, error) {
} }
func AddPermission(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 { if err != nil {
return false, err return false, err
} }
@@ -198,7 +198,7 @@ func AddPermissions(permissions []*Permission) bool {
return false return false
} }
affected, err := adapter.Engine.Insert(permissions) affected, err := ormer.Engine.Insert(permissions)
if err != nil { if err != nil {
if !strings.Contains(err.Error(), "Duplicate entry") { if !strings.Contains(err.Error(), "Duplicate entry") {
panic(err) panic(err)
@@ -242,7 +242,7 @@ func AddPermissionsInBatch(permissions []*Permission) bool {
} }
func DeletePermission(permission *Permission) (bool, error) { 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 { if err != nil {
return false, err return false, err
} }
@@ -251,9 +251,9 @@ func DeletePermission(permission *Permission) (bool, error) {
removeGroupingPolicies(permission) removeGroupingPolicies(permission)
removePolicies(permission) removePolicies(permission)
if permission.Adapter != "" && permission.Adapter != "permission_rule" { if permission.Adapter != "" && permission.Adapter != "permission_rule" {
isEmpty, _ := adapter.Engine.IsTableEmpty(permission.Adapter) isEmpty, _ := ormer.Engine.IsTableEmpty(permission.Adapter)
if isEmpty { if isEmpty {
err = adapter.Engine.DropTables(permission.Adapter) err = ormer.Engine.DropTables(permission.Adapter)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -266,7 +266,7 @@ func DeletePermission(permission *Permission) (bool, error) {
func GetPermissionsAndRolesByUser(userId string) ([]*Permission, []*Role, error) { func GetPermissionsAndRolesByUser(userId string) ([]*Permission, []*Role, error) {
permissions := []*Permission{} permissions := []*Permission{}
err := adapter.Engine.Where("users like ?", "%"+userId+"\"%").Find(&permissions) err := ormer.Engine.Where("users like ?", "%"+userId+"\"%").Find(&permissions)
if err != nil { if err != nil {
return nil, nil, err return nil, nil, err
} }
@@ -290,7 +290,7 @@ func GetPermissionsAndRolesByUser(userId string) ([]*Permission, []*Role, error)
for _, role := range roles { for _, role := range roles {
perms := []*Permission{} 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 { if err != nil {
return nil, nil, err return nil, nil, err
} }
@@ -310,7 +310,7 @@ func GetPermissionsAndRolesByUser(userId string) ([]*Permission, []*Role, error)
func GetPermissionsByRole(roleId string) ([]*Permission, error) { func GetPermissionsByRole(roleId string) ([]*Permission, error) {
permissions := []*Permission{} permissions := []*Permission{}
err := adapter.Engine.Where("roles like ?", "%"+roleId+"\"%").Find(&permissions) err := ormer.Engine.Where("roles like ?", "%"+roleId+"\"%").Find(&permissions)
if err != nil { if err != nil {
return permissions, err return permissions, err
} }
@@ -320,7 +320,7 @@ func GetPermissionsByRole(roleId string) ([]*Permission, error) {
func GetPermissionsByResource(resourceId string) ([]*Permission, error) { func GetPermissionsByResource(resourceId string) ([]*Permission, error) {
permissions := []*Permission{} permissions := []*Permission{}
err := adapter.Engine.Where("resources like ?", "%"+resourceId+"\"%").Find(&permissions) err := ormer.Engine.Where("resources like ?", "%"+resourceId+"\"%").Find(&permissions)
if err != nil { if err != nil {
return permissions, err return permissions, err
} }
@@ -330,7 +330,7 @@ func GetPermissionsByResource(resourceId string) ([]*Permission, error) {
func GetPermissionsBySubmitter(owner string, submitter string) ([]*Permission, error) { func GetPermissionsBySubmitter(owner string, submitter string) ([]*Permission, error) {
permissions := []*Permission{} 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 { if err != nil {
return permissions, err return permissions, err
} }
@@ -340,7 +340,7 @@ func GetPermissionsBySubmitter(owner string, submitter string) ([]*Permission, e
func GetPermissionsByModel(owner string, model string) ([]*Permission, error) { func GetPermissionsByModel(owner string, model string) ([]*Permission, error) {
permissions := []*Permission{} 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 { if err != nil {
return permissions, err return permissions, err
} }

View File

@@ -69,7 +69,7 @@ func getPermissionEnforcer(p *Permission, permissionIDs ...string) *casbin.Enfor
func (p *Permission) setEnforcerAdapter(enforcer *casbin.Enforcer) error { func (p *Permission) setEnforcerAdapter(enforcer *casbin.Enforcer) error {
tableName := "permission_rule" tableName := "permission_rule"
if len(p.Adapter) != 0 { if len(p.Adapter) != 0 {
adapterObj, err := getCasbinAdapter(p.Owner, p.Adapter) adapterObj, err := getAdapter(p.Owner, p.Adapter)
if err != nil { if err != nil {
return err return err
} }
@@ -81,12 +81,12 @@ func (p *Permission) setEnforcerAdapter(enforcer *casbin.Enforcer) error {
tableNamePrefix := conf.GetConfigString("tableNamePrefix") tableNamePrefix := conf.GetConfigString("tableNamePrefix")
driverName := conf.GetConfigString("driverName") driverName := conf.GetConfigString("driverName")
dataSourceName := conf.GetConfigRealDataSourceName(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 { if err != nil {
return err return err
} }
enforcer.SetAdapter(casbinAdapter) enforcer.SetAdapter(adapter)
return nil return nil
} }

View File

@@ -44,7 +44,7 @@ func GetPlanCount(owner, field, value string) (int64, error) {
func GetPlans(owner string) ([]*Plan, error) { func GetPlans(owner string) ([]*Plan, error) {
plans := []*Plan{} 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 { if err != nil {
return plans, err return plans, err
} }
@@ -67,7 +67,7 @@ func getPlan(owner, name string) (*Plan, error) {
} }
plan := Plan{Owner: owner, Name: name} plan := Plan{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&plan) existed, err := ormer.Engine.Get(&plan)
if err != nil { if err != nil {
return &plan, err return &plan, err
} }
@@ -91,7 +91,7 @@ func UpdatePlan(id string, plan *Plan) (bool, error) {
return false, nil 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 { if err != nil {
return false, err return false, err
} }
@@ -100,7 +100,7 @@ func UpdatePlan(id string, plan *Plan) (bool, error) {
} }
func AddPlan(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 { if err != nil {
return false, err return false, err
} }
@@ -108,7 +108,7 @@ func AddPlan(plan *Plan) (bool, error) {
} }
func DeletePlan(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 { if err != nil {
return false, err return false, err
} }

View File

@@ -48,7 +48,7 @@ func GetPricingCount(owner, field, value string) (int64, error) {
func GetPricings(owner string) ([]*Pricing, error) { func GetPricings(owner string) ([]*Pricing, error) {
pricings := []*Pricing{} 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 { if err != nil {
return pricings, err return pricings, err
} }
@@ -72,7 +72,7 @@ func getPricing(owner, name string) (*Pricing, error) {
} }
pricing := Pricing{Owner: owner, Name: name} pricing := Pricing{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&pricing) existed, err := ormer.Engine.Get(&pricing)
if err != nil { if err != nil {
return &pricing, err return &pricing, err
} }
@@ -96,7 +96,7 @@ func UpdatePricing(id string, pricing *Pricing) (bool, error) {
return false, nil 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 { if err != nil {
return false, err return false, err
} }
@@ -105,7 +105,7 @@ func UpdatePricing(id string, pricing *Pricing) (bool, error) {
} }
func AddPricing(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 { if err != nil {
return false, err return false, err
} }
@@ -113,7 +113,7 @@ func AddPricing(pricing *Pricing) (bool, error) {
} }
func DeletePricing(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 { if err != nil {
return false, err return false, err
} }

View File

@@ -17,6 +17,8 @@ package object
import ( import (
"fmt" "fmt"
"github.com/casdoor/casdoor/pp"
"github.com/casdoor/casdoor/util" "github.com/casdoor/casdoor/util"
"github.com/xorm-io/core" "github.com/xorm-io/core"
) )
@@ -50,7 +52,7 @@ func GetProductCount(owner, field, value string) (int64, error) {
func GetProducts(owner string) ([]*Product, error) { func GetProducts(owner string) ([]*Product, error) {
products := []*Product{} 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 { if err != nil {
return products, err return products, err
} }
@@ -75,7 +77,7 @@ func getProduct(owner string, name string) (*Product, error) {
} }
product := Product{Owner: owner, Name: name} product := Product{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&product) existed, err := ormer.Engine.Get(&product)
if err != nil { if err != nil {
return &product, nil return &product, nil
} }
@@ -100,7 +102,7 @@ func UpdateProduct(id string, product *Product) (bool, error) {
return false, nil 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 { if err != nil {
return false, err return false, err
} }
@@ -109,7 +111,7 @@ func UpdateProduct(id string, product *Product) (bool, error) {
} }
func AddProduct(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 { if err != nil {
return false, err return false, err
} }
@@ -118,7 +120,7 @@ func AddProduct(product *Product) (bool, error) {
} }
func DeleteProduct(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 { if err != nil {
return false, err return false, err
} }
@@ -183,36 +185,39 @@ func BuyProduct(id string, providerName string, user *User, host string) (string
productDisplayName := product.DisplayName productDisplayName := product.DisplayName
originFrontend, originBackend := getOriginFromHost(host) originFrontend, originBackend := getOriginFromHost(host)
returnUrl := fmt.Sprintf("%s/payments/%s/result", originFrontend, paymentName) returnUrl := fmt.Sprintf("%s/payments/%s/%s/result", originFrontend, owner, paymentName)
notifyUrl := fmt.Sprintf("%s/api/notify-payment/%s/%s/%s/%s", originBackend, owner, providerName, productName, paymentName) notifyUrl := fmt.Sprintf("%s/api/notify-payment/%s/%s", originBackend, owner, paymentName)
// Create an Order and get the payUrl
payUrl, orderId, err := pProvider.Pay(providerName, productName, payerName, paymentName, productDisplayName, product.Price, product.Currency, returnUrl, notifyUrl) payUrl, orderId, err := pProvider.Pay(providerName, productName, payerName, paymentName, productDisplayName, product.Price, product.Currency, returnUrl, notifyUrl)
if err != nil { if err != nil {
return "", "", err return "", "", err
} }
// Create a Payment linked with Product and Order
payment := Payment{ payment := Payment{
Owner: product.Owner, Owner: product.Owner,
Name: paymentName, Name: paymentName,
CreatedTime: util.GetCurrentTime(), CreatedTime: util.GetCurrentTime(),
DisplayName: paymentName, DisplayName: paymentName,
Provider: provider.Name,
Type: provider.Type, Provider: provider.Name,
Organization: user.Owner, Type: provider.Type,
User: user.Name,
ProductName: productName, ProductName: productName,
ProductDisplayName: productDisplayName, ProductDisplayName: productDisplayName,
Detail: product.Detail, Detail: product.Detail,
Tag: product.Tag, Tag: product.Tag,
Currency: product.Currency, Currency: product.Currency,
Price: product.Price, Price: product.Price,
PayUrl: payUrl,
ReturnUrl: product.ReturnUrl, ReturnUrl: product.ReturnUrl,
State: "Created",
User: user.Name,
PayUrl: payUrl,
State: pp.PaymentStateCreated,
OutOrderId: orderId,
} }
if provider.Type == "Dummy" { if provider.Type == "Dummy" {
payment.State = "Paid" payment.State = pp.PaymentStatePaid
} }
affected, err := AddPayment(&payment) affected, err := AddPayment(&payment)

View File

@@ -119,7 +119,7 @@ func GetGlobalProviderCount(field, value string) (int64, error) {
func GetProviders(owner string) ([]*Provider, error) { func GetProviders(owner string) ([]*Provider, error) {
providers := []*Provider{} 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 { if err != nil {
return providers, err return providers, err
} }
@@ -129,7 +129,7 @@ func GetProviders(owner string) ([]*Provider, error) {
func GetGlobalProviders() ([]*Provider, error) { func GetGlobalProviders() ([]*Provider, error) {
providers := []*Provider{} providers := []*Provider{}
err := adapter.Engine.Desc("created_time").Find(&providers) err := ormer.Engine.Desc("created_time").Find(&providers)
if err != nil { if err != nil {
return providers, err return providers, err
} }
@@ -165,7 +165,7 @@ func getProvider(owner string, name string) (*Provider, error) {
} }
provider := Provider{Name: name} provider := Provider{Name: name}
existed, err := adapter.Engine.Get(&provider) existed, err := ormer.Engine.Get(&provider)
if err != nil { if err != nil {
return &provider, err return &provider, err
} }
@@ -184,7 +184,7 @@ func GetProvider(id string) (*Provider, error) {
func getDefaultAiProvider() (*Provider, error) { func getDefaultAiProvider() (*Provider, error) {
provider := Provider{Owner: "admin", Category: "AI"} provider := Provider{Owner: "admin", Category: "AI"}
existed, err := adapter.Engine.Get(&provider) existed, err := ormer.Engine.Get(&provider)
if err != nil { if err != nil {
return &provider, err 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 == "***" { if provider.ClientSecret == "***" {
session = session.Omit("client_secret") session = session.Omit("client_secret")
} }
@@ -248,7 +248,7 @@ func AddProvider(provider *Provider) (bool, error) {
provider.IntranetEndpoint = util.GetEndPoint(provider.IntranetEndpoint) provider.IntranetEndpoint = util.GetEndPoint(provider.IntranetEndpoint)
} }
affected, err := adapter.Engine.Insert(provider) affected, err := ormer.Engine.Insert(provider)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -257,7 +257,7 @@ func AddProvider(provider *Provider) (bool, error) {
} }
func DeleteProvider(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 { if err != nil {
return false, err return false, err
} }
@@ -297,7 +297,7 @@ func (p *Provider) GetId() string {
func GetCaptchaProviderByOwnerName(applicationId, lang string) (*Provider, error) { func GetCaptchaProviderByOwnerName(applicationId, lang string) (*Provider, error) {
owner, name := util.GetOwnerAndNameFromId(applicationId) owner, name := util.GetOwnerAndNameFromId(applicationId)
provider := Provider{Owner: owner, Name: name, Category: "Captcha"} provider := Provider{Owner: owner, Name: name, Category: "Captcha"}
existed, err := adapter.Engine.Get(&provider) existed, err := ormer.Engine.Get(&provider)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -333,7 +333,7 @@ func GetCaptchaProviderByApplication(applicationId, isCurrentProvider, lang stri
} }
func providerChangeTrigger(oldName string, newName string) error { func providerChangeTrigger(oldName string, newName string) error {
session := adapter.Engine.NewSession() session := ormer.Engine.NewSession()
defer session.Close() defer session.Close()
err := session.Begin() err := session.Begin()
@@ -342,7 +342,7 @@ func providerChangeTrigger(oldName string, newName string) error {
} }
var applications []*Application var applications []*Application
err = adapter.Engine.Find(&applications) err = ormer.Engine.Find(&applications)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -96,7 +96,7 @@ func AddRecord(record *Record) bool {
fmt.Println(errWebhook) fmt.Println(errWebhook)
} }
affected, err := adapter.Engine.Insert(record) affected, err := ormer.Engine.Insert(record)
if err != nil { if err != nil {
panic(err) panic(err)
} }
@@ -111,7 +111,7 @@ func GetRecordCount(field, value string, filterRecord *Record) (int64, error) {
func GetRecords() ([]*Record, error) { func GetRecords() ([]*Record, error) {
records := []*Record{} records := []*Record{}
err := adapter.Engine.Desc("id").Find(&records) err := ormer.Engine.Desc("id").Find(&records)
if err != nil { if err != nil {
return records, err return records, err
} }
@@ -132,7 +132,7 @@ func GetPaginationRecords(offset, limit int, field, value, sortField, sortOrder
func GetRecordsByField(record *Record) ([]*Record, error) { func GetRecordsByField(record *Record) ([]*Record, error) {
records := []*Record{} records := []*Record{}
err := adapter.Engine.Find(&records, record) err := ormer.Engine.Find(&records, record)
if err != nil { if err != nil {
return records, err return records, err
} }

View File

@@ -52,7 +52,7 @@ func GetResources(owner string, user string) ([]*Resource, error) {
} }
resources := []*Resource{} 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 { if err != nil {
return resources, err return resources, err
} }
@@ -82,7 +82,7 @@ func getResource(owner string, name string) (*Resource, error) {
} }
resource := Resource{Owner: owner, Name: name} resource := Resource{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&resource) existed, err := ormer.Engine.Get(&resource)
if err != nil { if err != nil {
return &resource, err return &resource, err
} }
@@ -107,7 +107,7 @@ func UpdateResource(id string, resource *Resource) (bool, error) {
return false, nil 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 { if err != nil {
return false, err return false, err
} }
@@ -117,7 +117,7 @@ func UpdateResource(id string, resource *Resource) (bool, error) {
} }
func AddResource(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 { if err != nil {
return false, err return false, err
} }
@@ -126,7 +126,7 @@ func AddResource(resource *Resource) (bool, error) {
} }
func DeleteResource(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 { if err != nil {
return false, err return false, err
} }

View File

@@ -44,7 +44,7 @@ func GetRoleCount(owner, field, value string) (int64, error) {
func GetRoles(owner string) ([]*Role, error) { func GetRoles(owner string) ([]*Role, error) {
roles := []*Role{} 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 { if err != nil {
return roles, err return roles, err
} }
@@ -69,7 +69,7 @@ func getRole(owner string, name string) (*Role, error) {
} }
role := Role{Owner: owner, Name: name} role := Role{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&role) existed, err := ormer.Engine.Get(&role)
if err != nil { if err != nil {
return &role, err 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 { if err != nil {
return false, err return false, err
} }
@@ -178,7 +178,7 @@ func UpdateRole(id string, role *Role) (bool, error) {
} }
func AddRole(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 { if err != nil {
return false, err return false, err
} }
@@ -190,7 +190,7 @@ func AddRoles(roles []*Role) bool {
if len(roles) == 0 { if len(roles) == 0 {
return false return false
} }
affected, err := adapter.Engine.Insert(roles) affected, err := ormer.Engine.Insert(roles)
if err != nil { if err != nil {
if !strings.Contains(err.Error(), "Duplicate entry") { if !strings.Contains(err.Error(), "Duplicate entry") {
panic(err) 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 { if err != nil {
return false, err return false, err
} }
@@ -254,7 +254,7 @@ func (role *Role) GetId() string {
func GetRolesByUser(userId string) ([]*Role, error) { func GetRolesByUser(userId string) ([]*Role, error) {
roles := []*Role{} roles := []*Role{}
err := adapter.Engine.Where("users like ?", "%"+userId+"\"%").Find(&roles) err := ormer.Engine.Where("users like ?", "%"+userId+"\"%").Find(&roles)
if err != nil { if err != nil {
return roles, err return roles, err
} }
@@ -278,7 +278,7 @@ func GetRolesByUser(userId string) ([]*Role, error) {
} }
func roleChangeTrigger(oldName string, newName string) error { func roleChangeTrigger(oldName string, newName string) error {
session := adapter.Engine.NewSession() session := ormer.Engine.NewSession()
defer session.Close() defer session.Close()
err := session.Begin() err := session.Begin()
@@ -287,7 +287,7 @@ func roleChangeTrigger(oldName string, newName string) error {
} }
var roles []*Role var roles []*Role
err = adapter.Engine.Find(&roles) err = ormer.Engine.Find(&roles)
if err != nil { if err != nil {
return err return err
} }
@@ -306,7 +306,7 @@ func roleChangeTrigger(oldName string, newName string) error {
} }
var permissions []*Permission var permissions []*Permission
err = adapter.Engine.Find(&permissions) err = ormer.Engine.Find(&permissions)
if err != nil { if err != nil {
return err return err
} }
@@ -338,7 +338,7 @@ func GetMaskedRoles(roles []*Role) []*Role {
func GetRolesByNamePrefix(owner string, prefix string) ([]*Role, error) { func GetRolesByNamePrefix(owner string, prefix string) ([]*Role, error) {
roles := []*Role{} 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 { if err != nil {
return roles, err return roles, err
} }

View File

@@ -40,9 +40,9 @@ func GetSessions(owner string) ([]*Session, error) {
sessions := []*Session{} sessions := []*Session{}
var err error var err error
if owner != "" { 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 { } else {
err = adapter.Engine.Desc("created_time").Find(&sessions) err = ormer.Engine.Desc("created_time").Find(&sessions)
} }
if err != nil { if err != nil {
return sessions, err return sessions, err
@@ -70,7 +70,7 @@ func GetSessionCount(owner, field, value string) (int64, error) {
func GetSingleSession(id string) (*Session, error) { func GetSingleSession(id string) (*Session, error) {
owner, name, application := util.GetOwnerAndNameAndOtherFromId(id) owner, name, application := util.GetOwnerAndNameAndOtherFromId(id)
session := Session{Owner: owner, Name: name, Application: application} session := Session{Owner: owner, Name: name, Application: application}
get, err := adapter.Engine.Get(&session) get, err := ormer.Engine.Get(&session)
if err != nil { if err != nil {
return &session, err return &session, err
} }
@@ -91,7 +91,7 @@ func UpdateSession(id string, session *Session) (bool, error) {
return false, nil 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 { if err != nil {
return false, err return false, err
} }
@@ -114,7 +114,7 @@ func AddSession(session *Session) (bool, error) {
if dbSession == nil { if dbSession == nil {
session.CreatedTime = util.GetCurrentTime() session.CreatedTime = util.GetCurrentTime()
affected, err := adapter.Engine.Insert(session) affected, err := ormer.Engine.Insert(session)
if err != nil { if err != nil {
return false, err 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 { if err != nil {
return false, err return false, err
} }

View File

@@ -69,7 +69,7 @@ func GetSubscriptionCount(owner, field, value string) (int64, error) {
func GetSubscriptions(owner string) ([]*Subscription, error) { func GetSubscriptions(owner string) ([]*Subscription, error) {
subscriptions := []*Subscription{} 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 { if err != nil {
return subscriptions, err return subscriptions, err
} }
@@ -94,7 +94,7 @@ func getSubscription(owner string, name string) (*Subscription, error) {
} }
subscription := Subscription{Owner: owner, Name: name} subscription := Subscription{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&subscription) existed, err := ormer.Engine.Get(&subscription)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -119,7 +119,7 @@ func UpdateSubscription(id string, subscription *Subscription) (bool, error) {
return false, nil 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 { if err != nil {
return false, err return false, err
} }
@@ -128,7 +128,7 @@ func UpdateSubscription(id string, subscription *Subscription) (bool, error) {
} }
func AddSubscription(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 { if err != nil {
return false, err return false, err
} }
@@ -137,7 +137,7 @@ func AddSubscription(subscription *Subscription) (bool, error) {
} }
func DeleteSubscription(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 { if err != nil {
return false, err return false, err
} }

View File

@@ -53,7 +53,7 @@ type Syncer struct {
IsReadOnly bool `json:"isReadOnly"` IsReadOnly bool `json:"isReadOnly"`
IsEnabled bool `json:"isEnabled"` IsEnabled bool `json:"isEnabled"`
Adapter *Adapter `xorm:"-" json:"-"` Ormer *Ormer `xorm:"-" json:"-"`
} }
func GetSyncerCount(owner, organization, field, value string) (int64, error) { 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) { func GetSyncers(owner string) ([]*Syncer, error) {
syncers := []*Syncer{} 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 { if err != nil {
return syncers, err return syncers, err
} }
@@ -73,7 +73,7 @@ func GetSyncers(owner string) ([]*Syncer, error) {
func GetOrganizationSyncers(owner, organization string) ([]*Syncer, error) { func GetOrganizationSyncers(owner, organization string) ([]*Syncer, error) {
syncers := []*Syncer{} 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 { if err != nil {
return syncers, err return syncers, err
} }
@@ -98,7 +98,7 @@ func getSyncer(owner string, name string) (*Syncer, error) {
} }
syncer := Syncer{Owner: owner, Name: name} syncer := Syncer{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&syncer) existed, err := ormer.Engine.Get(&syncer)
if err != nil { if err != nil {
return &syncer, err return &syncer, err
} }
@@ -141,7 +141,7 @@ func UpdateSyncer(id string, syncer *Syncer) (bool, error) {
return false, nil return false, nil
} }
session := adapter.Engine.ID(core.PK{owner, name}).AllCols() session := ormer.Engine.ID(core.PK{owner, name}).AllCols()
if syncer.Password == "***" { if syncer.Password == "***" {
session.Omit("password") session.Omit("password")
} }
@@ -172,7 +172,7 @@ func updateSyncerErrorText(syncer *Syncer, line string) (bool, error) {
s.ErrorText = s.ErrorText + line 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 { if err != nil {
return false, err return false, err
} }
@@ -181,7 +181,7 @@ func updateSyncerErrorText(syncer *Syncer, line string) (bool, error) {
} }
func AddSyncer(syncer *Syncer) (bool, error) { func AddSyncer(syncer *Syncer) (bool, error) {
affected, err := adapter.Engine.Insert(syncer) affected, err := ormer.Engine.Insert(syncer)
if err != nil { if err != nil {
return false, err return false, err
} }
@@ -197,7 +197,7 @@ func AddSyncer(syncer *Syncer) (bool, error) {
} }
func DeleteSyncer(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 { if err != nil {
return false, err return false, err
} }

View File

@@ -21,7 +21,7 @@ type Affiliation struct {
func (syncer *Syncer) getAffiliations() ([]*Affiliation, error) { func (syncer *Syncer) getAffiliations() ([]*Affiliation, error) {
affiliations := []*Affiliation{} 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 { if err != nil {
return nil, err return nil, err
} }

View File

@@ -32,7 +32,7 @@ type Credential struct {
func (syncer *Syncer) getOriginalUsers() ([]*OriginalUser, error) { func (syncer *Syncer) getOriginalUsers() ([]*OriginalUser, error) {
sql := fmt.Sprintf("select * from %s", syncer.getTable()) 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 { if err != nil {
return nil, err return nil, err
} }
@@ -67,7 +67,7 @@ func (syncer *Syncer) addUser(user *OriginalUser) (bool, error) {
keyString, valueString := syncer.getSqlKeyValueStringFromMap(m) keyString, valueString := syncer.getSqlKeyValueStringFromMap(m)
sql := fmt.Sprintf("insert into %s (%s) values (%s)", syncer.getTable(), keyString, valueString) 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 { if err != nil {
return false, err return false, err
} }
@@ -108,7 +108,7 @@ func (syncer *Syncer) updateUser(user *OriginalUser) (bool, error) {
setString := syncer.getSqlSetStringFromMap(m) setString := syncer.getSqlSetStringFromMap(m)
sql := fmt.Sprintf("update %s set %s where %s = %s", syncer.getTable(), setString, syncer.TablePrimaryKey, pkValue) 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 { if err != nil {
return false, err return false, err
} }
@@ -138,7 +138,7 @@ func (syncer *Syncer) updateUserForOriginalFields(user *User) (bool, error) {
columns := syncer.getCasdoorColumns() columns := syncer.getCasdoorColumns()
columns = append(columns, "affiliation", "hash", "pre_hash") 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 { if err != nil {
return false, err return false, err
} }
@@ -160,7 +160,7 @@ func (syncer *Syncer) calculateHash(user *OriginalUser) string {
} }
func (syncer *Syncer) initAdapter() { func (syncer *Syncer) initAdapter() {
if syncer.Adapter == nil { if syncer.Ormer == nil {
var dataSourceName string var dataSourceName string
if syncer.DatabaseType == "mssql" { if syncer.DatabaseType == "mssql" {
dataSourceName = fmt.Sprintf("sqlserver://%s:%s@%s:%d?database=%s", syncer.User, syncer.Password, syncer.Host, syncer.Port, syncer.Database) 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.") dataSourceName = strings.ReplaceAll(dataSourceName, "dbi.", "db.")
} }
syncer.Adapter = NewAdapter(syncer.DatabaseType, dataSourceName, syncer.Database) syncer.Ormer = NewAdapter(syncer.DatabaseType, dataSourceName, syncer.Database)
} }
} }

View File

@@ -196,7 +196,7 @@ func (syncer *Syncer) getOriginalUsersFromMap(results []map[string]string) []*Or
if syncer.Type == "Keycloak" { if syncer.Type == "Keycloak" {
// query and set password and password salt from credential table // 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) 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 { if len(credentialResult) > 0 {
credential := Credential{} credential := Credential{}
_ = json.Unmarshal([]byte(credentialResult[0]["SECRET_DATA"]), &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 // query and set signup application from user group table
sql = fmt.Sprintf("select name from keycloak_group where id = "+ 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) "(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 { if len(groupResult) > 0 {
originalUser.SignupApplication = groupResult[0]["name"] originalUser.SignupApplication = groupResult[0]["name"]
} }

View File

@@ -98,7 +98,7 @@ func GetTokenCount(owner, organization, field, value string) (int64, error) {
func GetTokens(owner string, organization string) ([]*Token, error) { func GetTokens(owner string, organization string) ([]*Token, error) {
tokens := []*Token{} 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 return tokens, err
} }
@@ -115,7 +115,7 @@ func getToken(owner string, name string) (*Token, error) {
} }
token := Token{Owner: owner, Name: name} token := Token{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&token) existed, err := ormer.Engine.Get(&token)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -129,7 +129,7 @@ func getToken(owner string, name string) (*Token, error) {
func getTokenByCode(code string) (*Token, error) { func getTokenByCode(code string) (*Token, error) {
token := Token{Code: code} token := Token{Code: code}
existed, err := adapter.Engine.Get(&token) existed, err := ormer.Engine.Get(&token)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -142,7 +142,7 @@ func getTokenByCode(code string) (*Token, error) {
} }
func updateUsedByCode(token *Token) bool { 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 { if err != nil {
panic(err) panic(err)
} }
@@ -167,7 +167,7 @@ func UpdateToken(id string, token *Token) (bool, error) {
return false, nil 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 { if err != nil {
return false, err return false, err
} }
@@ -176,7 +176,7 @@ func UpdateToken(id string, token *Token) (bool, error) {
} }
func AddToken(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 { if err != nil {
return false, err return false, err
} }
@@ -185,7 +185,7 @@ func AddToken(token *Token) (bool, error) {
} }
func DeleteToken(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 { if err != nil {
return false, err return false, err
} }
@@ -195,7 +195,7 @@ func DeleteToken(token *Token) (bool, error) {
func ExpireTokenByAccessToken(accessToken string) (bool, *Application, *Token, error) { func ExpireTokenByAccessToken(accessToken string) (bool, *Application, *Token, error) {
token := Token{AccessToken: accessToken} token := Token{AccessToken: accessToken}
existed, err := adapter.Engine.Get(&token) existed, err := ormer.Engine.Get(&token)
if err != nil { if err != nil {
return false, nil, nil, err return false, nil, nil, err
} }
@@ -205,7 +205,7 @@ func ExpireTokenByAccessToken(accessToken string) (bool, *Application, *Token, e
} }
token.ExpiresIn = 0 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 { if err != nil {
return false, nil, nil, err return false, nil, nil, err
} }
@@ -221,7 +221,7 @@ func ExpireTokenByAccessToken(accessToken string) (bool, *Application, *Token, e
func GetTokenByAccessToken(accessToken string) (*Token, error) { func GetTokenByAccessToken(accessToken string) (*Token, error) {
// Check if the accessToken is in the database // Check if the accessToken is in the database
token := Token{AccessToken: accessToken} token := Token{AccessToken: accessToken}
existed, err := adapter.Engine.Get(&token) existed, err := ormer.Engine.Get(&token)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -235,7 +235,7 @@ func GetTokenByAccessToken(accessToken string) (*Token, error) {
func GetTokenByTokenAndApplication(token string, application string) (*Token, error) { func GetTokenByTokenAndApplication(token string, application string) (*Token, error) {
tokenResult := Token{} 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 { if err != nil {
return nil, err 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. // check whether the refresh token is valid, and has not expired.
token := Token{RefreshToken: refreshToken} token := Token{RefreshToken: refreshToken}
existed, err := adapter.Engine.Get(&token) existed, err := ormer.Engine.Get(&token)
if err != nil || !existed { if err != nil || !existed {
return &TokenError{ return &TokenError{
Error: InvalidGrant, Error: InvalidGrant,

View File

@@ -207,7 +207,7 @@ func GetGlobalUserCount(field, value string) (int64, error) {
func GetGlobalUsers() ([]*User, error) { func GetGlobalUsers() ([]*User, error) {
users := []*User{} users := []*User{}
err := adapter.Engine.Desc("created_time").Find(&users) err := ormer.Engine.Desc("created_time").Find(&users)
if err != nil { if err != nil {
return nil, err 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) { 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) { func GetUsers(owner string) ([]*User, error) {
users := []*User{} 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 { if err != nil {
return nil, err return nil, err
} }
@@ -252,7 +252,7 @@ func GetUsers(owner string) ([]*User, error) {
func GetUsersByTag(owner string, tag string) ([]*User, error) { func GetUsersByTag(owner string, tag string) ([]*User, error) {
users := []*User{} 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 { if err != nil {
return nil, err 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) { func GetSortedUsers(owner string, sorter string, limit int) ([]*User, error) {
users := []*User{} 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 { if err != nil {
return nil, err return nil, err
} }
@@ -291,7 +291,7 @@ func getUser(owner string, name string) (*User, error) {
} }
user := User{Owner: owner, Name: name} user := User{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&user) existed, err := ormer.Engine.Get(&user)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -309,7 +309,7 @@ func getUserById(owner string, id string) (*User, error) {
} }
user := User{Owner: owner, Id: id} user := User{Owner: owner, Id: id}
existed, err := adapter.Engine.Get(&user) existed, err := ormer.Engine.Get(&user)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -326,7 +326,7 @@ func getUserByWechatId(owner string, wechatOpenId string, wechatUnionId string)
wechatUnionId = wechatOpenId wechatUnionId = wechatOpenId
} }
user := &User{} 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 { if err != nil {
return nil, err return nil, err
} }
@@ -344,7 +344,7 @@ func GetUserByEmail(owner string, email string) (*User, error) {
} }
user := User{Owner: owner, Email: email} user := User{Owner: owner, Email: email}
existed, err := adapter.Engine.Get(&user) existed, err := ormer.Engine.Get(&user)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -362,7 +362,7 @@ func GetUserByPhone(owner string, phone string) (*User, error) {
} }
user := User{Owner: owner, Phone: phone} user := User{Owner: owner, Phone: phone}
existed, err := adapter.Engine.Get(&user) existed, err := ormer.Engine.Get(&user)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -380,7 +380,7 @@ func GetUserByUserId(owner string, userId string) (*User, error) {
} }
user := User{Owner: owner, Id: userId} user := User{Owner: owner, Id: userId}
existed, err := adapter.Engine.Get(&user) existed, err := ormer.Engine.Get(&user)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -397,7 +397,7 @@ func GetUserByAccessKey(accessKey string) (*User, error) {
return nil, nil return nil, nil
} }
user := User{AccessKey: accessKey} user := User{AccessKey: accessKey}
existed, err := adapter.Engine.Get(&user) existed, err := ormer.Engine.Get(&user)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -471,7 +471,7 @@ func GetMaskedUsers(users []*User, errs ...error) ([]*User, error) {
func GetLastUser(owner string) (*User, error) { func GetLastUser(owner string) (*User, error) {
user := User{Owner: owner} 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 { if err != nil {
return nil, err return nil, err
} }
@@ -546,7 +546,7 @@ func updateUser(id string, user *User, columns []string) (int64, error) {
return 0, err 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 { if err != nil {
return 0, err 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 { if err != nil {
return false, err return false, err
} }
@@ -638,7 +638,7 @@ func AddUser(user *User) (bool, error) {
} }
user.Ranking = int(count + 1) user.Ranking = int(count + 1)
affected, err := adapter.Engine.Insert(user) affected, err := ormer.Engine.Insert(user)
if err != nil { if err != nil {
return false, err 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 err != nil {
if !strings.Contains(err.Error(), "Duplicate entry") { if !strings.Contains(err.Error(), "Duplicate entry") {
return false, err return false, err
@@ -715,7 +715,7 @@ func DeleteUser(user *User) (bool, error) {
return false, err 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 { if err != nil {
return false, err return false, err
} }
@@ -779,7 +779,7 @@ func ExtendUserWithRolesAndPermissions(user *User) (err error) {
} }
func userChangeTrigger(oldName string, newName string) error { func userChangeTrigger(oldName string, newName string) error {
session := adapter.Engine.NewSession() session := ormer.Engine.NewSession()
defer session.Close() defer session.Close()
err := session.Begin() err := session.Begin()
@@ -788,7 +788,7 @@ func userChangeTrigger(oldName string, newName string) error {
} }
var roles []*Role var roles []*Role
err = adapter.Engine.Find(&roles) err = ormer.Engine.Find(&roles)
if err != nil { if err != nil {
return err return err
} }
@@ -808,7 +808,7 @@ func userChangeTrigger(oldName string, newName string) error {
} }
var permissions []*Permission var permissions []*Permission
err = adapter.Engine.Find(&permissions) err = ormer.Engine.Find(&permissions)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -25,7 +25,7 @@ import (
) )
func updateUserColumn(column string, user *User) bool { 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 { if err != nil {
panic(err) panic(err)
} }

View File

@@ -30,7 +30,7 @@ func GetUserByField(organizationName string, field string, value string) (*User,
} }
user := User{Owner: organizationName} 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 { if err != nil {
return nil, err return nil, err
} }
@@ -95,7 +95,7 @@ func SetUserField(user *User, field string, value string) (bool, error) {
bean[strings.ToLower(field)] = value 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 { if err != nil {
return false, err return false, err
} }
@@ -110,7 +110,7 @@ func SetUserField(user *User, field string, value string) (bool, error) {
return false, err 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 { if err != nil {
return false, err 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 { if err != nil {
return false, err return false, err
} }

View File

@@ -66,7 +66,7 @@ func IsAllowSend(user *User, remoteAddr, recordType string) error {
if user != nil { if user != nil {
record.User = user.GetId() 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 { if err != nil {
return err return err
} }
@@ -143,7 +143,7 @@ func AddToVerificationRecord(user *User, provider *Provider, remoteAddr, recordT
record.Time = time.Now().Unix() record.Time = time.Now().Unix()
record.IsUsed = false record.IsUsed = false
_, err := adapter.Engine.Insert(record) _, err := ormer.Engine.Insert(record)
if err != nil { if err != nil {
return err return err
} }
@@ -154,7 +154,7 @@ func AddToVerificationRecord(user *User, provider *Provider, remoteAddr, recordT
func getVerificationRecord(dest string) (*VerificationRecord, error) { func getVerificationRecord(dest string) (*VerificationRecord, error) {
var record VerificationRecord var record VerificationRecord
record.Receiver = dest 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 { if err != nil {
return nil, err return nil, err
} }
@@ -198,7 +198,7 @@ func DisableVerificationCode(dest string) (err error) {
} }
record.IsUsed = true 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 return
} }

View File

@@ -49,7 +49,7 @@ func GetWebhookCount(owner, organization, field, value string) (int64, error) {
func GetWebhooks(owner string, organization string) ([]*Webhook, error) { func GetWebhooks(owner string, organization string) ([]*Webhook, error) {
webhooks := []*Webhook{} 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 { if err != nil {
return webhooks, err return webhooks, err
} }
@@ -70,7 +70,7 @@ func GetPaginationWebhooks(owner, organization string, offset, limit int, field,
func getWebhooksByOrganization(organization string) ([]*Webhook, error) { func getWebhooksByOrganization(organization string) ([]*Webhook, error) {
webhooks := []*Webhook{} 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 { if err != nil {
return webhooks, err return webhooks, err
} }
@@ -84,7 +84,7 @@ func getWebhook(owner string, name string) (*Webhook, error) {
} }
webhook := Webhook{Owner: owner, Name: name} webhook := Webhook{Owner: owner, Name: name}
existed, err := adapter.Engine.Get(&webhook) existed, err := ormer.Engine.Get(&webhook)
if err != nil { if err != nil {
return &webhook, err return &webhook, err
} }
@@ -109,7 +109,7 @@ func UpdateWebhook(id string, webhook *Webhook) (bool, error) {
return false, nil 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 { if err != nil {
return false, err return false, err
} }
@@ -118,7 +118,7 @@ func UpdateWebhook(id string, webhook *Webhook) (bool, error) {
} }
func AddWebhook(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 { if err != nil {
return false, err return false, err
} }
@@ -127,7 +127,7 @@ func AddWebhook(webhook *Webhook) (bool, error) {
} }
func DeleteWebhook(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 { if err != nil {
return false, err return false, err
} }

View File

@@ -16,7 +16,6 @@ package pp
import ( import (
"context" "context"
"fmt"
"net/http" "net/http"
"github.com/casdoor/casdoor/util" "github.com/casdoor/casdoor/util"
@@ -67,10 +66,10 @@ func (pp *AlipayPaymentProvider) Pay(providerName string, productName string, pa
return payUrl, "", nil return payUrl, "", nil
} }
func (pp *AlipayPaymentProvider) Notify(request *http.Request, body []byte, authorityPublicKey string, orderId string) (string, string, float64, string, string, error) { func (pp *AlipayPaymentProvider) Notify(request *http.Request, body []byte, authorityPublicKey string, orderId string) (*NotifyResult, error) {
bm, err := alipay.ParseNotifyToBodyMap(request) bm, err := alipay.ParseNotifyToBodyMap(request)
if err != nil { if err != nil {
return "", "", 0, "", "", err return nil, err
} }
providerName := bm.Get("providerName") providerName := bm.Get("providerName")
@@ -82,13 +81,21 @@ func (pp *AlipayPaymentProvider) Notify(request *http.Request, body []byte, auth
ok, err := alipay.VerifySignWithCert(authorityPublicKey, bm) ok, err := alipay.VerifySignWithCert(authorityPublicKey, bm)
if err != nil { if err != nil {
return "", "", 0, "", "", err return nil, err
} }
if !ok { if !ok {
return "", "", 0, "", "", fmt.Errorf("VerifySignWithCert() failed: %v", ok) return nil, err
} }
notifyResult := &NotifyResult{
return productDisplayName, paymentName, price, productName, providerName, nil ProductName: productName,
ProductDisplayName: productDisplayName,
ProviderName: providerName,
OutOrderId: orderId,
PaymentStatus: PaymentStatePaid,
Price: price,
PaymentName: paymentName,
}
return notifyResult, nil
} }
func (pp *AlipayPaymentProvider) GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error) { func (pp *AlipayPaymentProvider) GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error) {

View File

@@ -31,8 +31,10 @@ func (pp *DummyPaymentProvider) Pay(providerName string, productName string, pay
return payUrl, "", nil return payUrl, "", nil
} }
func (pp *DummyPaymentProvider) Notify(request *http.Request, body []byte, authorityPublicKey string, orderId string) (string, string, float64, string, string, error) { func (pp *DummyPaymentProvider) Notify(request *http.Request, body []byte, authorityPublicKey string, orderId string) (*NotifyResult, error) {
return "", "", 0, "", "", nil return &NotifyResult{
PaymentStatus: PaymentStatePaid,
}, nil
} }
func (pp *DummyPaymentProvider) GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error) { func (pp *DummyPaymentProvider) GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error) {

View File

@@ -216,11 +216,11 @@ func (pp *GcPaymentProvider) Pay(providerName string, productName string, payerN
return payRespInfo.PayUrl, "", nil return payRespInfo.PayUrl, "", nil
} }
func (pp *GcPaymentProvider) Notify(request *http.Request, body []byte, authorityPublicKey string, orderId string) (string, string, float64, string, string, error) { func (pp *GcPaymentProvider) Notify(request *http.Request, body []byte, authorityPublicKey string, orderId string) (*NotifyResult, error) {
reqBody := GcRequestBody{} reqBody := GcRequestBody{}
m, err := url.ParseQuery(string(body)) m, err := url.ParseQuery(string(body))
if err != nil { if err != nil {
return "", "", 0, "", "", err return nil, err
} }
reqBody.Op = m["op"][0] reqBody.Op = m["op"][0]
@@ -232,13 +232,13 @@ func (pp *GcPaymentProvider) Notify(request *http.Request, body []byte, authorit
notifyReqInfoBytes, err := base64.StdEncoding.DecodeString(reqBody.Data) notifyReqInfoBytes, err := base64.StdEncoding.DecodeString(reqBody.Data)
if err != nil { if err != nil {
return "", "", 0, "", "", err return nil, err
} }
var notifyRespInfo GcNotifyRespInfo var notifyRespInfo GcNotifyRespInfo
err = json.Unmarshal(notifyReqInfoBytes, &notifyRespInfo) err = json.Unmarshal(notifyReqInfoBytes, &notifyRespInfo)
if err != nil { if err != nil {
return "", "", 0, "", "", err return nil, err
} }
providerName := "" providerName := ""
@@ -249,10 +249,18 @@ func (pp *GcPaymentProvider) Notify(request *http.Request, body []byte, authorit
price := notifyRespInfo.Amount price := notifyRespInfo.Amount
if notifyRespInfo.OrderState != "1" { if notifyRespInfo.OrderState != "1" {
return "", "", 0, "", "", fmt.Errorf("error order state: %s", notifyRespInfo.OrderDate) return nil, fmt.Errorf("error order state: %s", notifyRespInfo.OrderDate)
} }
notifyResult := &NotifyResult{
return productDisplayName, paymentName, price, productName, providerName, nil ProductName: productName,
ProductDisplayName: productDisplayName,
ProviderName: providerName,
OutOrderId: orderId,
Price: price,
PaymentStatus: PaymentStatePaid,
PaymentName: paymentName,
}
return notifyResult, nil
} }
func (pp *GcPaymentProvider) GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error) { func (pp *GcPaymentProvider) GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error) {

View File

@@ -20,6 +20,8 @@ import (
"net/http" "net/http"
"strconv" "strconv"
"github.com/casdoor/casdoor/conf"
"github.com/go-pay/gopay" "github.com/go-pay/gopay"
"github.com/go-pay/gopay/paypal" "github.com/go-pay/gopay/paypal"
"github.com/go-pay/gopay/pkg/util" "github.com/go-pay/gopay/pkg/util"
@@ -31,8 +33,14 @@ type PaypalPaymentProvider struct {
func NewPaypalPaymentProvider(clientID string, secret string) (*PaypalPaymentProvider, error) { func NewPaypalPaymentProvider(clientID string, secret string) (*PaypalPaymentProvider, error) {
pp := &PaypalPaymentProvider{} pp := &PaypalPaymentProvider{}
isProd := false
client, err := paypal.NewClient(clientID, secret, false) if conf.GetConfigString("runmode") == "prod" {
isProd = true
}
client, err := paypal.NewClient(clientID, secret, isProd)
//if !isProd {
// client.DebugSwitch = gopay.DebugOn
//}
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -42,27 +50,27 @@ func NewPaypalPaymentProvider(clientID string, secret string) (*PaypalPaymentPro
} }
func (pp *PaypalPaymentProvider) Pay(providerName string, productName string, payerName string, paymentName string, productDisplayName string, price float64, currency string, returnUrl string, notifyUrl string) (string, string, error) { func (pp *PaypalPaymentProvider) Pay(providerName string, productName string, payerName string, paymentName string, productDisplayName string, price float64, currency string, returnUrl string, notifyUrl string) (string, string, error) {
// pp.Client.DebugSwitch = gopay.DebugOn // Set log to terminal stdout // https://github.com/go-pay/gopay/blob/main/doc/paypal.md
priceStr := strconv.FormatFloat(price, 'f', 2, 64) priceStr := strconv.FormatFloat(price, 'f', 2, 64)
var pus []*paypal.PurchaseUnit units := make([]*paypal.PurchaseUnit, 0, 1)
item := &paypal.PurchaseUnit{ unit := &paypal.PurchaseUnit{
ReferenceId: util.GetRandomString(16), ReferenceId: util.GetRandomString(16),
Amount: &paypal.Amount{ Amount: &paypal.Amount{
CurrencyCode: currency, CurrencyCode: currency, // e.g."USD"
Value: priceStr, Value: priceStr, // e.g."100.00"
}, },
Description: joinAttachString([]string{productDisplayName, productName, providerName}), Description: joinAttachString([]string{productDisplayName, productName, providerName}),
} }
pus = append(pus, item) units = append(units, unit)
bm := make(gopay.BodyMap) bm := make(gopay.BodyMap)
bm.Set("intent", "CAPTURE") bm.Set("intent", "CAPTURE")
bm.Set("purchase_units", pus) bm.Set("purchase_units", units)
bm.SetBodyMap("application_context", func(b gopay.BodyMap) { bm.SetBodyMap("application_context", func(b gopay.BodyMap) {
b.Set("brand_name", "Casdoor") b.Set("brand_name", "Casdoor")
b.Set("locale", "en-PT") b.Set("locale", "en-PT")
b.Set("return_url", returnUrl) b.Set("return_url", returnUrl)
b.Set("cancel_url", returnUrl)
}) })
ppRsp, err := pp.Client.CreateOrder(context.Background(), bm) ppRsp, err := pp.Client.CreateOrder(context.Background(), bm)
@@ -72,31 +80,65 @@ func (pp *PaypalPaymentProvider) Pay(providerName string, productName string, pa
if ppRsp.Code != paypal.Success { if ppRsp.Code != paypal.Success {
return "", "", errors.New(ppRsp.Error) return "", "", errors.New(ppRsp.Error)
} }
// {"id":"9BR68863NE220374S","status":"CREATED",
// "links":[{"href":"https://api.sandbox.paypal.com/v2/checkout/orders/9BR68863NE220374S","rel":"self","method":"GET"},
// {"href":"https://www.sandbox.paypal.com/checkoutnow?token=9BR68863NE220374S","rel":"approve","method":"GET"},
// {"href":"https://api.sandbox.paypal.com/v2/checkout/orders/9BR68863NE220374S","rel":"update","method":"PATCH"},
// {"href":"https://api.sandbox.paypal.com/v2/checkout/orders/9BR68863NE220374S/capture","rel":"capture","method":"POST"}]}
return ppRsp.Response.Links[1].Href, ppRsp.Response.Id, nil return ppRsp.Response.Links[1].Href, ppRsp.Response.Id, nil
} }
func (pp *PaypalPaymentProvider) Notify(request *http.Request, body []byte, authorityPublicKey string, orderId string) (string, string, float64, string, string, error) { func (pp *PaypalPaymentProvider) Notify(request *http.Request, body []byte, authorityPublicKey string, orderId string) (*NotifyResult, error) {
ppRsp, err := pp.Client.OrderCapture(context.Background(), orderId, nil) captureRsp, err := pp.Client.OrderCapture(context.Background(), orderId, nil)
if err != nil { if err != nil {
return "", "", 0, "", "", err return nil, err
} }
if ppRsp.Code != paypal.Success { if captureRsp.Code != paypal.Success {
return "", "", 0, "", "", errors.New(ppRsp.Error) // If order is already captured, just skip this type of error and check the order detail
if !(len(captureRsp.ErrorResponse.Details) == 1 && captureRsp.ErrorResponse.Details[0].Issue == "ORDER_ALREADY_CAPTURED") {
return nil, errors.New(captureRsp.ErrorResponse.Message)
}
}
// Check the order detail
detailRsp, err := pp.Client.OrderDetail(context.Background(), orderId, nil)
if err != nil {
return nil, err
}
if captureRsp.Code != paypal.Success {
return nil, errors.New(captureRsp.ErrorResponse.Message)
} }
paymentName := ppRsp.Response.Id paymentName := detailRsp.Response.Id
price, err := strconv.ParseFloat(ppRsp.Response.PurchaseUnits[0].Amount.Value, 64) price, err := strconv.ParseFloat(detailRsp.Response.PurchaseUnits[0].Amount.Value, 64)
if err != nil { if err != nil {
return "", "", 0, "", "", err return nil, err
} }
currency := detailRsp.Response.PurchaseUnits[0].Amount.CurrencyCode
productDisplayName, productName, providerName, err := parseAttachString(ppRsp.Response.PurchaseUnits[0].Description) productDisplayName, productName, providerName, err := parseAttachString(detailRsp.Response.PurchaseUnits[0].Description)
if err != nil { if err != nil {
return "", "", 0, "", "", err return nil, err
} }
// TODO: status better handler, e.g.`hanging`
var paymentStatus PaymentState
switch detailRsp.Response.Status { // CREATED、SAVED、APPROVED、VOIDED、COMPLETED、PAYER_ACTION_REQUIRED
case "COMPLETED":
paymentStatus = PaymentStatePaid
default:
paymentStatus = PaymentStateError
}
notifyResult := &NotifyResult{
PaymentStatus: paymentStatus,
PaymentName: paymentName,
return productDisplayName, paymentName, price, productName, providerName, nil ProductName: productName,
ProductDisplayName: productDisplayName,
ProviderName: providerName,
Price: price,
Currency: currency,
OutOrderId: orderId,
}
return notifyResult, nil
} }
func (pp *PaypalPaymentProvider) GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error) { func (pp *PaypalPaymentProvider) GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error) {

View File

@@ -14,11 +14,34 @@
package pp package pp
import "net/http" import (
"net/http"
)
type PaymentState string
const (
PaymentStatePaid PaymentState = "Paid"
PaymentStateCreated PaymentState = "Created"
PaymentStateError PaymentState = "Error"
)
type NotifyResult struct {
PaymentName string
PaymentStatus PaymentState
ProviderName string
ProductName string
ProductDisplayName string
Price float64
Currency string
OutOrderId string
}
type PaymentProvider interface { type PaymentProvider interface {
Pay(providerName string, productName string, payerName string, paymentName string, productDisplayName string, price float64, currency string, returnUrl string, notifyUrl string) (string, string, error) Pay(providerName string, productName string, payerName string, paymentName string, productDisplayName string, price float64, currency string, returnUrl string, notifyUrl string) (string, string, error)
Notify(request *http.Request, body []byte, authorityPublicKey string, orderId string) (string, string, float64, string, string, error) Notify(request *http.Request, body []byte, authorityPublicKey string, orderId string) (*NotifyResult, error)
GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error) GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error)
GetResponseError(err error) string GetResponseError(err error) string
} }

View File

@@ -83,22 +83,22 @@ func (pp *WechatPaymentProvider) Pay(providerName string, productName string, pa
return wxRsp.Response.CodeUrl, "", nil return wxRsp.Response.CodeUrl, "", nil
} }
func (pp *WechatPaymentProvider) Notify(request *http.Request, body []byte, authorityPublicKey string, orderId string) (string, string, float64, string, string, error) { func (pp *WechatPaymentProvider) Notify(request *http.Request, body []byte, authorityPublicKey string, orderId string) (*NotifyResult, error) {
notifyReq, err := wechat.V3ParseNotify(request) notifyReq, err := wechat.V3ParseNotify(request)
if err != nil { if err != nil {
panic(err) return nil, err
} }
cert := pp.Client.WxPublicKey() cert := pp.Client.WxPublicKey()
err = notifyReq.VerifySignByPK(cert) err = notifyReq.VerifySignByPK(cert)
if err != nil { if err != nil {
return "", "", 0, "", "", err return nil, err
} }
apiKey := string(pp.Client.ApiV3Key) apiKey := string(pp.Client.ApiV3Key)
result, err := notifyReq.DecryptCipherText(apiKey) result, err := notifyReq.DecryptCipherText(apiKey)
if err != nil { if err != nil {
return "", "", 0, "", "", err return nil, err
} }
paymentName := result.OutTradeNo paymentName := result.OutTradeNo
@@ -106,10 +106,19 @@ func (pp *WechatPaymentProvider) Notify(request *http.Request, body []byte, auth
productDisplayName, productName, providerName, err := parseAttachString(result.Attach) productDisplayName, productName, providerName, err := parseAttachString(result.Attach)
if err != nil { if err != nil {
return "", "", 0, "", "", err return nil, err
} }
return productDisplayName, paymentName, price, productName, providerName, nil notifyResult := &NotifyResult{
ProductName: productName,
ProductDisplayName: productDisplayName,
ProviderName: providerName,
OutOrderId: orderId,
Price: price,
PaymentStatus: PaymentStatePaid,
PaymentName: paymentName,
}
return notifyResult, nil
} }
func (pp *WechatPaymentProvider) GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error) { func (pp *WechatPaymentProvider) GetInvoice(paymentName string, personName string, personIdCard string, personEmail string, personPhone string, invoiceType string, invoiceTitle string, invoiceTaxId string) (string, error) {

View File

@@ -150,7 +150,7 @@ func getUrlPath(urlPath string) string {
return urlPath return urlPath
} }
func AuthzFilter(ctx *context.Context) { func ApiFilter(ctx *context.Context) {
subOwner, subName := getSubject(ctx) subOwner, subName := getSubject(ctx)
method := ctx.Request.Method method := ctx.Request.Method
urlPath := getUrlPath(ctx.Request.URL.Path) urlPath := getUrlPath(ctx.Request.URL.Path)

View File

@@ -13,13 +13,13 @@
// limitations under the License. // limitations under the License.
// Package routers // Package routers
// @APIVersion 1.0.0 // @APIVersion 1.376.1
// @Title Casdoor API // @Title Casdoor RESTful API
// @Description Documentation of Casdoor API // @Description Swagger Docs of Casdoor Backend API
// @Contact admin@casbin.org // @Contact casbin@googlegroups.com
// @SecurityDefinition test_apiKey apiKey Authorization header // @SecurityDefinition AccessToken apiKey Authorization header
// @Schemes http,https // @Schemes https,http
// @ExternalDocs Find out more about casdoor // @ExternalDocs Find out more about Casdoor
// @ExternalDocsUrl https://casdoor.org/ // @ExternalDocsUrl https://casdoor.org/
package routers package routers
@@ -117,12 +117,12 @@ func initAPI() {
beego.Router("/api/add-model", &controllers.ApiController{}, "POST:AddModel") beego.Router("/api/add-model", &controllers.ApiController{}, "POST:AddModel")
beego.Router("/api/delete-model", &controllers.ApiController{}, "POST:DeleteModel") beego.Router("/api/delete-model", &controllers.ApiController{}, "POST:DeleteModel")
beego.Router("/api/get-adapters", &controllers.ApiController{}, "GET:GetCasbinAdapters") beego.Router("/api/get-adapters", &controllers.ApiController{}, "GET:GetAdapters")
beego.Router("/api/get-adapter", &controllers.ApiController{}, "GET:GetCasbinAdapter") beego.Router("/api/get-adapter", &controllers.ApiController{}, "GET:GetAdapter")
beego.Router("/api/update-adapter", &controllers.ApiController{}, "POST:UpdateCasbinAdapter") beego.Router("/api/update-adapter", &controllers.ApiController{}, "POST:UpdateAdapter")
beego.Router("/api/add-adapter", &controllers.ApiController{}, "POST:AddCasbinAdapter") beego.Router("/api/add-adapter", &controllers.ApiController{}, "POST:AddAdapter")
beego.Router("/api/delete-adapter", &controllers.ApiController{}, "POST:DeleteCasbinAdapter") beego.Router("/api/delete-adapter", &controllers.ApiController{}, "POST:DeleteAdapter")
beego.Router("/api/sync-policies", &controllers.ApiController{}, "GET:SyncPolicies") beego.Router("/api/get-policies", &controllers.ApiController{}, "GET:GetPolicies")
beego.Router("/api/update-policy", &controllers.ApiController{}, "POST:UpdatePolicy") beego.Router("/api/update-policy", &controllers.ApiController{}, "POST:UpdatePolicy")
beego.Router("/api/add-policy", &controllers.ApiController{}, "POST:AddPolicy") beego.Router("/api/add-policy", &controllers.ApiController{}, "POST:AddPolicy")
beego.Router("/api/remove-policy", &controllers.ApiController{}, "POST:RemovePolicy") beego.Router("/api/remove-policy", &controllers.ApiController{}, "POST:RemovePolicy")
@@ -255,24 +255,12 @@ func initAPI() {
beego.Router("/api/update-payment", &controllers.ApiController{}, "POST:UpdatePayment") beego.Router("/api/update-payment", &controllers.ApiController{}, "POST:UpdatePayment")
beego.Router("/api/add-payment", &controllers.ApiController{}, "POST:AddPayment") beego.Router("/api/add-payment", &controllers.ApiController{}, "POST:AddPayment")
beego.Router("/api/delete-payment", &controllers.ApiController{}, "POST:DeletePayment") beego.Router("/api/delete-payment", &controllers.ApiController{}, "POST:DeletePayment")
beego.Router("/api/notify-payment/?:owner/?:provider/?:product/?:payment", &controllers.ApiController{}, "POST:NotifyPayment") beego.Router("/api/notify-payment/?:owner/?:payment", &controllers.ApiController{}, "POST:NotifyPayment")
beego.Router("/api/invoice-payment", &controllers.ApiController{}, "POST:InvoicePayment") beego.Router("/api/invoice-payment", &controllers.ApiController{}, "POST:InvoicePayment")
beego.Router("/api/send-email", &controllers.ApiController{}, "POST:SendEmail") beego.Router("/api/send-email", &controllers.ApiController{}, "POST:SendEmail")
beego.Router("/api/send-sms", &controllers.ApiController{}, "POST:SendSms") 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/begin", &controllers.ApiController{}, "Get:WebAuthnSignupBegin")
beego.Router("/api/webauthn/signup/finish", &controllers.ApiController{}, "Post:WebAuthnSignupFinish") beego.Router("/api/webauthn/signup/finish", &controllers.ApiController{}, "Post:WebAuthnSignupFinish")
beego.Router("/api/webauthn/signin/begin", &controllers.ApiController{}, "Get:WebAuthnSigninBegin") 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.Router("/api/get-prometheus-info", &controllers.ApiController{}, "GET:GetPrometheusInfo")
beego.Handler("/api/metrics", promhttp.Handler()) 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")
} }

View File

@@ -68,11 +68,11 @@ func StaticFilter(ctx *context.Context) {
if oldStaticBaseUrl == newStaticBaseUrl { if oldStaticBaseUrl == newStaticBaseUrl {
makeGzipResponse(ctx.ResponseWriter, ctx.Request, path) makeGzipResponse(ctx.ResponseWriter, ctx.Request, path)
} else { } else {
serveFileWithReplace(ctx.ResponseWriter, ctx.Request, path, oldStaticBaseUrl, newStaticBaseUrl) serveFileWithReplace(ctx.ResponseWriter, ctx.Request, path)
} }
} }
func serveFileWithReplace(w http.ResponseWriter, r *http.Request, name string, old string, new string) { func serveFileWithReplace(w http.ResponseWriter, r *http.Request, name string) {
f, err := os.Open(filepath.Clean(name)) f, err := os.Open(filepath.Clean(name))
if err != nil { if err != nil {
panic(err) panic(err)
@@ -85,13 +85,9 @@ func serveFileWithReplace(w http.ResponseWriter, r *http.Request, name string, o
} }
oldContent := util.ReadStringFromPath(name) oldContent := util.ReadStringFromPath(name)
newContent := strings.ReplaceAll(oldContent, old, new) newContent := strings.ReplaceAll(oldContent, oldStaticBaseUrl, newStaticBaseUrl)
http.ServeContent(w, r, d.Name(), d.ModTime(), strings.NewReader(newContent)) http.ServeContent(w, r, d.Name(), d.ModTime(), strings.NewReader(newContent))
_, err = w.Write([]byte(newContent))
if err != nil {
panic(err)
}
} }
type gzipResponseWriter struct { type gzipResponseWriter struct {
@@ -105,12 +101,12 @@ func (w gzipResponseWriter) Write(b []byte) (int, error) {
func makeGzipResponse(w http.ResponseWriter, r *http.Request, path string) { func makeGzipResponse(w http.ResponseWriter, r *http.Request, path string) {
if !enableGzip || !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") { if !enableGzip || !strings.Contains(r.Header.Get("Accept-Encoding"), "gzip") {
http.ServeFile(w, r, path) serveFileWithReplace(w, r, path)
return return
} }
w.Header().Set("Content-Encoding", "gzip") w.Header().Set("Content-Encoding", "gzip")
gz := gzip.NewWriter(w) gz := gzip.NewWriter(w)
defer gz.Close() defer gz.Close()
gzw := gzipResponseWriter{Writer: gz, ResponseWriter: w} gzw := gzipResponseWriter{Writer: gz, ResponseWriter: w}
http.ServeFile(gzw, r, path) serveFileWithReplace(gzw, r, path)
} }

View File

@@ -1,17 +1,17 @@
{ {
"swagger": "2.0", "swagger": "2.0",
"info": { "info": {
"title": "Casdoor API", "title": "Casdoor RESTful API",
"description": "Documentation of Casdoor API", "description": "Swagger Docs of Casdoor Backend API",
"version": "1.0.0", "version": "1.376.1",
"contact": { "contact": {
"email": "admin@casbin.org" "email": "casbin@googlegroups.com"
} }
}, },
"basePath": "/", "basePath": "/",
"schemes": [ "schemes": [
"http", "https",
"https" "http"
], ],
"paths": { "paths": {
"/.well-known/jwks": { "/.well-known/jwks": {
@@ -53,7 +53,7 @@
"Adapter API" "Adapter API"
], ],
"description": "add adapter", "description": "add adapter",
"operationId": "ApiController.AddCasbinAdapter", "operationId": "ApiController.AddAdapter",
"parameters": [ "parameters": [
{ {
"in": "body", "in": "body",
@@ -999,7 +999,7 @@
"Adapter API" "Adapter API"
], ],
"description": "delete adapter", "description": "delete adapter",
"operationId": "ApiController.DeleteCasbinAdapter", "operationId": "ApiController.DeleteAdapter",
"parameters": [ "parameters": [
{ {
"in": "body", "in": "body",
@@ -1751,7 +1751,7 @@
"Adapter API" "Adapter API"
], ],
"description": "get adapter", "description": "get adapter",
"operationId": "ApiController.GetCasbinAdapter", "operationId": "ApiController.GetAdapter",
"parameters": [ "parameters": [
{ {
"in": "query", "in": "query",
@@ -1777,7 +1777,7 @@
"Adapter API" "Adapter API"
], ],
"description": "get adapters", "description": "get adapters",
"operationId": "ApiController.GetCasbinAdapters", "operationId": "ApiController.GetAdapters",
"parameters": [ "parameters": [
{ {
"in": "query", "in": "query",
@@ -4382,7 +4382,7 @@
"Adapter API" "Adapter API"
], ],
"description": "update adapter", "description": "update adapter",
"operationId": "ApiController.UpdateCasbinAdapter", "operationId": "ApiController.UpdateAdapter",
"parameters": [ "parameters": [
{ {
"in": "query", "in": "query",
@@ -5485,13 +5485,13 @@
"properties": { "properties": {
"data": { "data": {
"additionalProperties": { "additionalProperties": {
"description": "support string | class | List\u003cclass\u003e and os on", "description": "support string, struct or []struct",
"type": "string" "type": "string"
} }
}, },
"data2": { "data2": {
"additionalProperties": { "additionalProperties": {
"description": "support string | class | List\u003cclass\u003e and os on", "description": "support string, struct or []struct",
"type": "string" "type": "string"
} }
}, },
@@ -7771,21 +7771,15 @@
"type": "object", "type": "object",
"properties": { "properties": {
"contentType": { "contentType": {
"default": "application/json", "type": "string"
"type": "string",
"example": "application/json"
}, },
"createdTime": { "createdTime": {
"default": "2023-07-27T17:09:12+08:00", "type": "string"
"type": "string",
"example": "2023-07-27T17:09:12+08:00"
}, },
"events": { "events": {
"type": "array", "type": "array",
"items": { "items": {
"type": "string", "type": "string"
"default": "test",
"example": "test"
} }
}, },
"headers": { "headers": {
@@ -7795,39 +7789,25 @@
} }
}, },
"isEnabled": { "isEnabled": {
"default": true, "type": "boolean"
"type": "boolean",
"example": true
}, },
"isUserExtended": { "isUserExtended": {
"default": true, "type": "boolean"
"type": "boolean",
"example": true
}, },
"method": { "method": {
"default": "POST", "type": "string"
"type": "string",
"example": "POST"
}, },
"name": { "name": {
"default": "test", "type": "string"
"type": "string",
"example": "test"
}, },
"organization": { "organization": {
"default": "built-in", "type": "string"
"type": "string",
"example": "built-in"
}, },
"owner": { "owner": {
"default": "built-in", "type": "string"
"type": "string",
"example": "built-in"
}, },
"url": { "url": {
"default": "https://example.com/callback", "type": "string"
"type": "string",
"example": "https://example.com/callback"
} }
} }
}, },
@@ -7894,14 +7874,14 @@
} }
}, },
"securityDefinitions": { "securityDefinitions": {
"test_apiKey": { "AccessToken": {
"type": "apiKey", "type": "apiKey",
"name": "Authorization", "name": "Authorization",
"in": "header" "in": "header"
} }
}, },
"externalDocs": { "externalDocs": {
"description": "Find out more about casdoor", "description": "Find out more about Casdoor",
"url": "https://casdoor.org/" "url": "https://casdoor.org/"
} }
} }

View File

@@ -1,14 +1,14 @@
swagger: "2.0" swagger: "2.0"
info: info:
title: Casdoor API title: Casdoor RESTful API
description: Documentation of Casdoor API description: Swagger Docs of Casdoor Backend API
version: 1.0.0 version: 1.376.1
contact: contact:
email: admin@casbin.org email: casbin@googlegroups.com
basePath: / basePath: /
schemes: schemes:
- http
- https - https
- http
paths: paths:
/.well-known/jwks: /.well-known/jwks:
get: get:
@@ -36,7 +36,7 @@ paths:
tags: tags:
- Adapter API - Adapter API
description: add adapter description: add adapter
operationId: ApiController.AddCasbinAdapter operationId: ApiController.AddAdapter
parameters: parameters:
- in: body - in: body
name: body name: body
@@ -647,7 +647,7 @@ paths:
tags: tags:
- Adapter API - Adapter API
description: delete adapter description: delete adapter
operationId: ApiController.DeleteCasbinAdapter operationId: ApiController.DeleteAdapter
parameters: parameters:
- in: body - in: body
name: body name: body
@@ -1131,7 +1131,7 @@ paths:
tags: tags:
- Adapter API - Adapter API
description: get adapter description: get adapter
operationId: ApiController.GetCasbinAdapter operationId: ApiController.GetAdapter
parameters: parameters:
- in: query - in: query
name: id name: id
@@ -1148,7 +1148,7 @@ paths:
tags: tags:
- Adapter API - Adapter API
description: get adapters description: get adapters
operationId: ApiController.GetCasbinAdapters operationId: ApiController.GetAdapters
parameters: parameters:
- in: query - in: query
name: owner name: owner
@@ -2861,7 +2861,7 @@ paths:
tags: tags:
- Adapter API - Adapter API
description: update adapter description: update adapter
operationId: ApiController.UpdateCasbinAdapter operationId: ApiController.UpdateAdapter
parameters: parameters:
- in: query - in: query
name: id name: id
@@ -3589,11 +3589,11 @@ definitions:
properties: properties:
data: data:
additionalProperties: additionalProperties:
description: support string | class | List<class> and os on description: support string, struct or []struct
type: string type: string
data2: data2:
additionalProperties: additionalProperties:
description: support string | class | List<class> and os on description: support string, struct or []struct
type: string type: string
msg: msg:
type: string type: string
@@ -5126,51 +5126,31 @@ definitions:
type: object type: object
properties: properties:
contentType: contentType:
default: application/json
type: string type: string
example: application/json
createdTime: createdTime:
default: "2023-07-27T17:09:12+08:00"
type: string type: string
example: "2023-07-27T17:09:12+08:00"
events: events:
default: '[ddd]'
type: array type: array
items: items:
type: string type: string
headers: headers:
default: '[]'
type: array type: array
items: items:
$ref: '#/definitions/object.Header' $ref: '#/definitions/object.Header'
isEnabled: isEnabled:
default: true
type: boolean type: boolean
example: true
isUserExtended: isUserExtended:
default: true
type: boolean type: boolean
example: true
method: method:
default: POST
type: string type: string
example: POST
name: name:
default: test
type: string type: string
example: test
organization: organization:
default: built-in
type: string type: string
example: built-in
owner: owner:
default: built-in
type: string type: string
example: built-in
url: url:
default: https://example.com/callback
type: string type: string
example: https://example.com/callback
protocol.CredentialAssertion: protocol.CredentialAssertion:
title: CredentialAssertion title: CredentialAssertion
type: object type: object
@@ -5216,10 +5196,10 @@ definitions:
title: Engine title: Engine
type: object type: object
securityDefinitions: securityDefinitions:
test_apiKey: AccessToken:
type: apiKey type: apiKey
name: Authorization name: Authorization
in: header in: header
externalDocs: externalDocs:
description: Find out more about casdoor description: Find out more about Casdoor
url: https://casdoor.org/ url: https://casdoor.org/

View File

@@ -13,14 +13,13 @@
// limitations under the License. // limitations under the License.
import React from "react"; 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 AdapterBackend from "./backend/AdapterBackend";
import * as OrganizationBackend from "./backend/OrganizationBackend"; import * as OrganizationBackend from "./backend/OrganizationBackend";
import * as Setting from "./Setting"; import * as Setting from "./Setting";
import i18next from "i18next"; import i18next from "i18next";
import "codemirror/lib/codemirror.css"; import "codemirror/lib/codemirror.css";
import * as ModelBackend from "./backend/ModelBackend";
import PolicyTable from "./table/PoliciyTable"; import PolicyTable from "./table/PoliciyTable";
require("codemirror/theme/material-darker.css"); require("codemirror/theme/material-darker.css");
require("codemirror/mode/javascript/javascript"); require("codemirror/mode/javascript/javascript");
@@ -36,7 +35,6 @@ class AdapterEditPage extends React.Component {
adapterName: props.match.params.adapterName, adapterName: props.match.params.adapterName,
adapter: null, adapter: null,
organizations: [], organizations: [],
models: [],
mode: props.location.mode !== undefined ? props.location.mode : "edit", mode: props.location.mode !== undefined ? props.location.mode : "edit",
}; };
} }
@@ -58,8 +56,6 @@ class AdapterEditPage extends React.Component {
this.setState({ this.setState({
adapter: res.data, adapter: res.data,
}); });
this.getModels(this.state.organizationName);
} }
}); });
} }
@@ -73,24 +69,10 @@ class AdapterEditPage extends React.Component {
}); });
} }
getModels(organizationName) {
ModelBackend.getModels(organizationName)
.then((res) => {
if (res.status === "error") {
Setting.showMessage("error", res.msg);
return;
}
this.setState({
models: res.data,
});
});
}
parseAdapterField(key, value) { parseAdapterField(key, value) {
if (["port"].includes(key)) { // if ([].includes(key)) {
value = Setting.myParseInt(value); // value = Setting.myParseInt(value);
} // }
return value; return value;
} }
@@ -104,6 +86,73 @@ class AdapterEditPage extends React.Component {
}); });
} }
renderDataSourceNameConfig() {
if (Setting.builtInObject(this.state.adapter)) {
return null;
}
return (
<React.Fragment>{
this.state.adapter.databaseType === "sqlite3" ?
(
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("syncer:File"), i18next.t("provider:File - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.adapter.host} onChange={e => {
this.updateAdapterField("file", e.target.value);
}} />
</Col>
</Row>
) : (
<React.Fragment>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("provider:Host"), i18next.t("provider:Host - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.adapter.host} onChange={e => {
this.updateAdapterField("host", e.target.value);
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("provider:Port"), i18next.t("provider:Port - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.adapter.port} onChange={e => {
this.updateAdapterField("port", e.target.value);
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("general:User"), i18next.t("general:User - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.adapter.user} onChange={e => {
this.updateAdapterField("user", e.target.value);
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("general:Password"), i18next.t("general:Password - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.adapter.password} onChange={e => {
this.updateAdapterField("password", e.target.value);
}} />
</Col>
</Row>
</React.Fragment>
)
}
</React.Fragment>
);
}
renderAdapter() { renderAdapter() {
return ( return (
<Card size="small" title={ <Card size="small" title={
@@ -119,8 +168,7 @@ class AdapterEditPage extends React.Component {
{Setting.getLabel(i18next.t("general:Organization"), i18next.t("general:Organization - Tooltip"))} : {Setting.getLabel(i18next.t("general:Organization"), i18next.t("general:Organization - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Select virtual={false} style={{width: "100%"}} disabled={!Setting.isAdminUser(this.props.account)} value={this.state.adapter.owner} onChange={(value => { <Select virtual={false} style={{width: "100%"}} disabled={!Setting.isAdminUser(this.props.account) || Setting.builtInObject(this.state.adapter)} value={this.state.adapter.owner} onChange={(value => {
this.getModels(value);
this.updateAdapterField("owner", value); this.updateAdapterField("owner", value);
})}> })}>
{ {
@@ -134,7 +182,7 @@ class AdapterEditPage extends React.Component {
{Setting.getLabel(i18next.t("general:Name"), i18next.t("general:Name - Tooltip"))} : {Setting.getLabel(i18next.t("general:Name"), i18next.t("general:Name - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Input value={this.state.adapter.name} onChange={e => { <Input disabled={Setting.builtInObject(this.state.adapter)} value={this.state.adapter.name} onChange={e => {
this.updateAdapterField("name", e.target.value); this.updateAdapterField("name", e.target.value);
}} /> }} />
</Col> </Col>
@@ -144,7 +192,7 @@ class AdapterEditPage extends React.Component {
{Setting.getLabel(i18next.t("provider:Type"), i18next.t("provider:Type - Tooltip"))} : {Setting.getLabel(i18next.t("provider:Type"), i18next.t("provider:Type - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Select virtual={false} style={{width: "100%"}} value={this.state.adapter.type} onChange={(value => { <Select virtual={false} disabled={Setting.builtInObject(this.state.adapter)} style={{width: "100%"}} value={this.state.adapter.type} onChange={(value => {
this.updateAdapterField("type", value); this.updateAdapterField("type", value);
const adapter = this.state.adapter; const adapter = this.state.adapter;
// adapter["tableColumns"] = Setting.getAdapterTableColumns(this.state.adapter); // adapter["tableColumns"] = Setting.getAdapterTableColumns(this.state.adapter);
@@ -159,52 +207,12 @@ class AdapterEditPage extends React.Component {
</Select> </Select>
</Col> </Col>
</Row> </Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("provider:Host"), i18next.t("provider:Host - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.adapter.host} onChange={e => {
this.updateAdapterField("host", e.target.value);
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("provider:Port"), i18next.t("provider:Port - Tooltip"))} :
</Col>
<Col span={22} >
<InputNumber value={this.state.adapter.port} onChange={value => {
this.updateAdapterField("port", value);
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("general:User"), i18next.t("general:User - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.adapter.user} onChange={e => {
this.updateAdapterField("user", e.target.value);
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("general:Password"), i18next.t("general:Password - Tooltip"))} :
</Col>
<Col span={22} >
<Input value={this.state.adapter.password} onChange={e => {
this.updateAdapterField("password", e.target.value);
}} />
</Col>
</Row>
<Row style={{marginTop: "20px"}} > <Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}> <Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("syncer:Database type"), i18next.t("syncer:Database type - Tooltip"))} : {Setting.getLabel(i18next.t("syncer:Database type"), i18next.t("syncer:Database type - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Select virtual={false} style={{width: "100%"}} value={this.state.adapter.databaseType} onChange={(value => {this.updateAdapterField("databaseType", value);})}> <Select virtual={false} disabled={Setting.builtInObject(this.state.adapter)} style={{width: "100%"}} value={this.state.adapter.databaseType} onChange={(value => {this.updateAdapterField("databaseType", value);})}>
{ {
[ [
{id: "mysql", name: "MySQL"}, {id: "mysql", name: "MySQL"},
@@ -217,12 +225,13 @@ class AdapterEditPage extends React.Component {
</Select> </Select>
</Col> </Col>
</Row> </Row>
{this.state.adapter.type === "Database" ? this.renderDataSourceNameConfig() : null}
<Row style={{marginTop: "20px"}} > <Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}> <Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("syncer:Database"), i18next.t("syncer:Database - Tooltip"))} : {Setting.getLabel(i18next.t("syncer:Database"), i18next.t("syncer:Database - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Input value={this.state.adapter.database} onChange={e => { <Input disabled={Setting.builtInObject(this.state.adapter)} value={this.state.adapter.database} onChange={e => {
this.updateAdapterField("database", e.target.value); this.updateAdapterField("database", e.target.value);
}} /> }} />
</Col> </Col>
@@ -233,25 +242,11 @@ class AdapterEditPage extends React.Component {
</Col> </Col>
<Col span={22} > <Col span={22} >
<Input value={this.state.adapter.table} <Input value={this.state.adapter.table}
disabled={this.state.adapter.type === "Keycloak"} onChange={e => { disabled={Setting.builtInObject(this.state.adapter)} onChange={e => {
this.updateAdapterField("table", e.target.value); this.updateAdapterField("table", e.target.value);
}} /> }} />
</Col> </Col>
</Row> </Row>
<Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("general:Model"), i18next.t("general:Model - Tooltip"))} :
</Col>
<Col span={22} >
<Select virtual={false} style={{width: "100%"}} value={this.state.adapter.model} onChange={(model => {
this.updateAdapterField("model", model);
})}>
{
this.state.models.map((model, index) => <Option key={index} value={model.name}>{model.name}</Option>)
}
</Select>
</Col>
</Row>
<Row style={{marginTop: "20px"}} > <Row style={{marginTop: "20px"}} >
<Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}> <Col style={{marginTop: "5px"}} span={(Setting.isMobile()) ? 22 : 2}>
{Setting.getLabel(i18next.t("adapter:Policies"), i18next.t("adapter:Policies - Tooltip"))} : {Setting.getLabel(i18next.t("adapter:Policies"), i18next.t("adapter:Policies - Tooltip"))} :

View File

@@ -32,7 +32,7 @@ class AdapterListPage extends BaseListPage {
createdTime: moment().format(), createdTime: moment().format(),
type: "Database", type: "Database",
host: "localhost", host: "localhost",
port: 3306, port: "3306",
user: "root", user: "root",
password: "123456", password: "123456",
databaseType: "mysql", databaseType: "mysql",
@@ -206,6 +206,7 @@ class AdapterListPage extends BaseListPage {
<div> <div>
<Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary" onClick={() => this.props.history.push(`/adapters/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button> <Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary" onClick={() => this.props.history.push(`/adapters/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button>
<PopconfirmModal <PopconfirmModal
disabled={Setting.builtInObject(record)}
title={i18next.t("general:Sure to delete") + `: ${record.name} ?`} title={i18next.t("general:Sure to delete") + `: ${record.name} ?`}
onConfirm={() => this.deleteAdapter(index)} onConfirm={() => this.deleteAdapter(index)}
> >

View File

@@ -641,10 +641,10 @@ class App extends Component {
<Route exact path="/subscriptions/:organizationName/:subscriptionName" render={(props) => this.renderLoginIfNotLoggedIn(<SubscriptionEditPage account={this.state.account} {...props} />)} /> <Route exact path="/subscriptions/:organizationName/:subscriptionName" render={(props) => this.renderLoginIfNotLoggedIn(<SubscriptionEditPage account={this.state.account} {...props} />)} />
<Route exact path="/products" render={(props) => this.renderLoginIfNotLoggedIn(<ProductListPage account={this.state.account} {...props} />)} /> <Route exact path="/products" render={(props) => this.renderLoginIfNotLoggedIn(<ProductListPage account={this.state.account} {...props} />)} />
<Route exact path="/products/:organizationName/:productName" render={(props) => this.renderLoginIfNotLoggedIn(<ProductEditPage account={this.state.account} {...props} />)} /> <Route exact path="/products/:organizationName/:productName" render={(props) => this.renderLoginIfNotLoggedIn(<ProductEditPage account={this.state.account} {...props} />)} />
<Route exact path="/products/:productName/buy" render={(props) => this.renderLoginIfNotLoggedIn(<ProductBuyPage account={this.state.account} {...props} />)} /> <Route exact path="/products/:organizationName/:productName/buy" render={(props) => this.renderLoginIfNotLoggedIn(<ProductBuyPage account={this.state.account} {...props} />)} />
<Route exact path="/payments" render={(props) => this.renderLoginIfNotLoggedIn(<PaymentListPage account={this.state.account} {...props} />)} /> <Route exact path="/payments" render={(props) => this.renderLoginIfNotLoggedIn(<PaymentListPage account={this.state.account} {...props} />)} />
<Route exact path="/payments/:paymentName" render={(props) => this.renderLoginIfNotLoggedIn(<PaymentEditPage account={this.state.account} {...props} />)} /> <Route exact path="/payments/:organizationName/:paymentName" render={(props) => this.renderLoginIfNotLoggedIn(<PaymentEditPage account={this.state.account} {...props} />)} />
<Route exact path="/payments/:paymentName/result" render={(props) => this.renderLoginIfNotLoggedIn(<PaymentResultPage account={this.state.account} {...props} />)} /> <Route exact path="/payments/:organizationName/:paymentName/result" render={(props) => this.renderLoginIfNotLoggedIn(<PaymentResultPage account={this.state.account} {...props} />)} />
<Route exact path="/records" render={(props) => this.renderLoginIfNotLoggedIn(<RecordListPage account={this.state.account} {...props} />)} /> <Route exact path="/records" render={(props) => this.renderLoginIfNotLoggedIn(<RecordListPage account={this.state.account} {...props} />)} />
<Route exact path="/mfa/setup" render={(props) => this.renderLoginIfNotLoggedIn(<MfaSetupPage account={this.state.account} onfinish={() => this.setState({requiredEnableMfa: false})} {...props} />)} /> <Route exact path="/mfa/setup" render={(props) => this.renderLoginIfNotLoggedIn(<MfaSetupPage account={this.state.account} onfinish={() => this.setState({requiredEnableMfa: false})} {...props} />)} />
<Route exact path="/.well-known/openid-configuration" render={(props) => <OdicDiscoveryPage />} /> <Route exact path="/.well-known/openid-configuration" render={(props) => <OdicDiscoveryPage />} />

View File

@@ -122,7 +122,7 @@ class EnforcerEditPage extends React.Component {
{Setting.getLabel(i18next.t("general:Organization"), i18next.t("general:Organization - Tooltip"))} : {Setting.getLabel(i18next.t("general:Organization"), i18next.t("general:Organization - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Select virtual={false} style={{width: "100%"}} disabled={!Setting.isAdminUser(this.props.account)} value={this.state.enforcer.owner} onChange={(owner => { <Select virtual={false} style={{width: "100%"}} disabled={!Setting.isAdminUser(this.props.account) || Setting.builtInObject(this.state.enforcer)} value={this.state.enforcer.owner} onChange={(owner => {
this.updateEnforcerField("owner", owner); this.updateEnforcerField("owner", owner);
this.getModels(owner); this.getModels(owner);
this.getAdapters(owner); this.getAdapters(owner);
@@ -136,7 +136,7 @@ class EnforcerEditPage extends React.Component {
{Setting.getLabel(i18next.t("general:Name"), i18next.t("general:Name - Tooltip"))} : {Setting.getLabel(i18next.t("general:Name"), i18next.t("general:Name - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Input value={this.state.enforcer.name} onChange={e => { <Input disabled={Setting.builtInObject(this.state.enforcer)} value={this.state.enforcer.name} onChange={e => {
this.updateEnforcerField("name", e.target.value); this.updateEnforcerField("name", e.target.value);
}} /> }} />
</Col> </Col>
@@ -166,10 +166,10 @@ class EnforcerEditPage extends React.Component {
{Setting.getLabel(i18next.t("general:Model"), i18next.t("general:Model - Tooltip"))} : {Setting.getLabel(i18next.t("general:Model"), i18next.t("general:Model - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Select virtual={false} style={{width: "100%"}} value={this.state.enforcer.model} onChange={(model => { <Select virtual={false} disabled={Setting.builtInObject(this.state.enforcer)} style={{width: "100%"}} value={this.state.enforcer.model} onChange={(model => {
this.updateEnforcerField("model", model); 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}`))
} /> } />
</Col> </Col>
</Row> </Row>
@@ -178,10 +178,10 @@ class EnforcerEditPage extends React.Component {
{Setting.getLabel(i18next.t("general:Adapter"), i18next.t("general:Adapter - Tooltip"))} : {Setting.getLabel(i18next.t("general:Adapter"), i18next.t("general:Adapter - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Select virtual={false} style={{width: "100%"}} value={this.state.enforcer.adapter} onChange={(adapter => { <Select virtual={false} disabled={Setting.builtInObject(this.state.enforcer)} style={{width: "100%"}} value={this.state.enforcer.adapter} onChange={(adapter => {
this.updateEnforcerField("adapter", adapter); 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}`))
} /> } />
</Col> </Col>
</Row> </Row>

View File

@@ -144,6 +144,7 @@ class EnforcerListPage extends BaseListPage {
<Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary" <Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary"
onClick={() => this.props.history.push(`/enforcers/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button> onClick={() => this.props.history.push(`/enforcers/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button>
<PopconfirmModal <PopconfirmModal
disabled={Setting.builtInObject(record)}
title={i18next.t("general:Sure to delete") + `: ${record.name} ?`} title={i18next.t("general:Sure to delete") + `: ${record.name} ?`}
onConfirm={() => this.deleteEnforcer(index)} onConfirm={() => this.deleteEnforcer(index)}
> >

View File

@@ -105,7 +105,7 @@ class ModelEditPage extends React.Component {
{Setting.getLabel(i18next.t("general:Organization"), i18next.t("general:Organization - Tooltip"))} : {Setting.getLabel(i18next.t("general:Organization"), i18next.t("general:Organization - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Select virtual={false} style={{width: "100%"}} disabled={!Setting.isAdminUser(this.props.account)} value={this.state.model.owner} onChange={(value => {this.updateModelField("owner", value);})}> <Select virtual={false} style={{width: "100%"}} disabled={!Setting.isAdminUser(this.props.account) || Setting.builtInObject(this.state.model)} value={this.state.model.owner} onChange={(value => {this.updateModelField("owner", value);})}>
{ {
this.state.organizations.map((organization, index) => <Option key={index} value={organization.name}>{organization.name}</Option>) this.state.organizations.map((organization, index) => <Option key={index} value={organization.name}>{organization.name}</Option>)
} }
@@ -117,7 +117,7 @@ class ModelEditPage extends React.Component {
{Setting.getLabel(i18next.t("general:Name"), i18next.t("general:Name - Tooltip"))} : {Setting.getLabel(i18next.t("general:Name"), i18next.t("general:Name - Tooltip"))} :
</Col> </Col>
<Col span={22} > <Col span={22} >
<Input value={this.state.model.name} onChange={e => { <Input disabled={Setting.builtInObject(this.state.model)} value={this.state.model.name} onChange={e => {
this.updateModelField("name", e.target.value); this.updateModelField("name", e.target.value);
}} /> }} />
</Col> </Col>
@@ -152,6 +152,9 @@ class ModelEditPage extends React.Component {
value={this.state.model.modelText} value={this.state.model.modelText}
options={{mode: "properties", theme: "default"}} options={{mode: "properties", theme: "default"}}
onBeforeChange={(editor, data, value) => { onBeforeChange={(editor, data, value) => {
if (Setting.builtInObject(this.state.model)) {
return;
}
this.updateModelField("modelText", value); this.updateModelField("modelText", value);
}} }}
/> />

View File

@@ -160,6 +160,7 @@ class ModelListPage extends BaseListPage {
<Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary" <Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary"
onClick={() => this.props.history.push(`/models/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button> onClick={() => this.props.history.push(`/models/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button>
<PopconfirmModal <PopconfirmModal
disabled={Setting.builtInObject(record)}
title={i18next.t("general:Sure to delete") + `: ${record.name} ?`} title={i18next.t("general:Sure to delete") + `: ${record.name} ?`}
onConfirm={() => this.deleteModel(index)} onConfirm={() => this.deleteModel(index)}
> >

View File

@@ -40,7 +40,7 @@ class PaymentEditPage extends React.Component {
} }
getPayment() { getPayment() {
PaymentBackend.getPayment("admin", this.state.paymentName) PaymentBackend.getPayment(this.state.organizationName, this.state.paymentName)
.then((res) => { .then((res) => {
if (res.data === null) { if (res.data === null) {
this.props.history.push("/404"); this.props.history.push("/404");

View File

@@ -28,13 +28,12 @@ class PaymentListPage extends BaseListPage {
const randomName = Setting.getRandomName(); const randomName = Setting.getRandomName();
const organizationName = Setting.getRequestOrganization(this.props.account); const organizationName = Setting.getRequestOrganization(this.props.account);
return { return {
owner: "admin", owner: organizationName,
name: `payment_${randomName}`, name: `payment_${randomName}`,
createdTime: moment().format(), createdTime: moment().format(),
displayName: `New Payment - ${randomName}`, displayName: `New Payment - ${randomName}`,
provider: "provider_pay_paypal", provider: "provider_pay_paypal",
type: "PayPal", type: "PayPal",
organization: organizationName,
user: "admin", user: "admin",
productName: "computer-1", productName: "computer-1",
productDisplayName: "A notebook computer", productDisplayName: "A notebook computer",
@@ -54,7 +53,7 @@ class PaymentListPage extends BaseListPage {
PaymentBackend.addPayment(newPayment) PaymentBackend.addPayment(newPayment)
.then((res) => { .then((res) => {
if (res.status === "ok") { if (res.status === "ok") {
this.props.history.push({pathname: `/payments/${newPayment.name}`, mode: "add"}); this.props.history.push({pathname: `/payments/${newPayment.owner}/${newPayment.name}`, mode: "add"});
Setting.showMessage("success", i18next.t("general:Successfully added")); Setting.showMessage("success", i18next.t("general:Successfully added"));
} else { } else {
Setting.showMessage("error", `${i18next.t("general:Failed to add")}: ${res.msg}`); Setting.showMessage("error", `${i18next.t("general:Failed to add")}: ${res.msg}`);
@@ -96,7 +95,7 @@ class PaymentListPage extends BaseListPage {
...this.getColumnSearchProps("name"), ...this.getColumnSearchProps("name"),
render: (text, record, index) => { render: (text, record, index) => {
return ( return (
<Link to={`/payments/${text}`}> <Link to={`/payments/${record.owner}/${text}`}>
{text} {text}
</Link> </Link>
); );
@@ -112,7 +111,7 @@ class PaymentListPage extends BaseListPage {
...this.getColumnSearchProps("provider"), ...this.getColumnSearchProps("provider"),
render: (text, record, index) => { render: (text, record, index) => {
return ( return (
<Link to={`/providers/${text}`}> <Link to={`/providers/${record.owner}/${text}`}>
{text} {text}
</Link> </Link>
); );
@@ -120,11 +119,11 @@ class PaymentListPage extends BaseListPage {
}, },
{ {
title: i18next.t("general:Organization"), title: i18next.t("general:Organization"),
dataIndex: "organization", dataIndex: "owner",
key: "organization", key: "owner",
width: "120px", width: "120px",
sorter: true, sorter: true,
...this.getColumnSearchProps("organization"), ...this.getColumnSearchProps("owner"),
render: (text, record, index) => { render: (text, record, index) => {
return ( return (
<Link to={`/organizations/${text}`}> <Link to={`/organizations/${text}`}>
@@ -142,7 +141,7 @@ class PaymentListPage extends BaseListPage {
...this.getColumnSearchProps("user"), ...this.getColumnSearchProps("user"),
render: (text, record, index) => { render: (text, record, index) => {
return ( return (
<Link to={`/users/${record.organization}/${text}`}> <Link to={`/users/${record.owner}/${text}`}>
{text} {text}
</Link> </Link>
); );
@@ -222,8 +221,8 @@ class PaymentListPage extends BaseListPage {
render: (text, record, index) => { render: (text, record, index) => {
return ( return (
<div> <div>
<Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} onClick={() => this.props.history.push(`/payments/${record.name}/result`)}>{i18next.t("payment:Result")}</Button> <Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} onClick={() => this.props.history.push(`/payments/${record.owner}/${record.name}/result`)}>{i18next.t("payment:Result")}</Button>
<Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary" onClick={() => this.props.history.push(`/payments/${record.name}`)}>{i18next.t("general:Edit")}</Button> <Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary" onClick={() => this.props.history.push(`/payments/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button>
<PopconfirmModal <PopconfirmModal
title={i18next.t("general:Sure to delete") + `: ${record.name} ?`} title={i18next.t("general:Sure to delete") + `: ${record.name} ?`}
onConfirm={() => this.deletePayment(index)} onConfirm={() => this.deletePayment(index)}
@@ -266,7 +265,7 @@ class PaymentListPage extends BaseListPage {
value = params.type; value = params.type;
} }
this.setState({loading: true}); this.setState({loading: true});
PaymentBackend.getPayments("admin", Setting.isDefaultOrganizationSelected(this.props.account) ? "" : Setting.getRequestOrganization(this.props.account), params.pagination.current, params.pagination.pageSize, field, value, sortField, sortOrder) PaymentBackend.getPayments(Setting.getRequestOrganization(this.props.account), Setting.isDefaultOrganizationSelected(this.props.account) ? "" : Setting.getRequestOrganization(this.props.account), params.pagination.current, params.pagination.pageSize, field, value, sortField, sortOrder)
.then((res) => { .then((res) => {
this.setState({ this.setState({
loading: false, loading: false,

View File

@@ -24,6 +24,7 @@ class PaymentResultPage extends React.Component {
this.state = { this.state = {
classes: props, classes: props,
paymentName: props.match.params.paymentName, paymentName: props.match.params.paymentName,
organizationName: props.match.params.organizationName,
payment: null, payment: null,
timeout: null, timeout: null,
}; };
@@ -40,18 +41,37 @@ class PaymentResultPage extends React.Component {
} }
getPayment() { getPayment() {
PaymentBackend.getPayment("admin", this.state.paymentName) PaymentBackend.getPayment(this.state.organizationName, this.state.paymentName)
.then((res) => { .then((res) => {
this.setState({ this.setState({
payment: res.data, payment: res.data,
}); });
// window.console.log("payment=", res.data);
if (res.data.state === "Created") { if (res.data.state === "Created") {
this.setState({timeout: setTimeout(() => this.getPayment(), 1000)}); if (res.data.type === "PayPal") {
this.setState({
timeout: setTimeout(() => {
PaymentBackend.notifyPayment(this.state.organizationName, this.state.paymentName)
.then((res) => {
this.getPayment();
});
}, 1000),
});
} else {
this.setState({timeout: setTimeout(() => this.getPayment(), 1000)});
}
} }
}); });
} }
goToPaymentUrl(payment) {
if (payment.returnUrl === undefined || payment.returnUrl === null || payment.returnUrl === "") {
Setting.goToLink(`${window.location.origin}/products/${payment.owner}/${payment.productName}/buy`);
} else {
Setting.goToLink(payment.returnUrl);
}
}
render() { render() {
const payment = this.state.payment; const payment = this.state.payment;
@@ -71,7 +91,7 @@ class PaymentResultPage extends React.Component {
subTitle={i18next.t("payment:Please click the below button to return to the original website")} subTitle={i18next.t("payment:Please click the below button to return to the original website")}
extra={[ extra={[
<Button type="primary" key="returnUrl" onClick={() => { <Button type="primary" key="returnUrl" onClick={() => {
Setting.goToLink(payment.returnUrl); this.goToPaymentUrl(payment);
}}> }}>
{i18next.t("payment:Return to Website")} {i18next.t("payment:Return to Website")}
</Button>, </Button>,
@@ -107,7 +127,7 @@ class PaymentResultPage extends React.Component {
subTitle={i18next.t("payment:Please click the below button to return to the original website")} subTitle={i18next.t("payment:Please click the below button to return to the original website")}
extra={[ extra={[
<Button type="primary" key="returnUrl" onClick={() => { <Button type="primary" key="returnUrl" onClick={() => {
Setting.goToLink(payment.returnUrl); this.goToPaymentUrl(payment);
}}> }}>
{i18next.t("payment:Return to Website")} {i18next.t("payment:Return to Website")}
</Button>, </Button>,

View File

@@ -24,7 +24,8 @@ class ProductBuyPage extends React.Component {
super(props); super(props);
this.state = { this.state = {
classes: props, classes: props,
productName: props.match?.params.productName, organizationName: props.organizationName !== undefined ? props.organizationName : props?.match?.params?.organizationName,
productName: props.productName !== undefined ? props.productName : props?.match?.params?.productName,
product: null, product: null,
isPlacingOrder: false, isPlacingOrder: false,
qrCodeModalProvider: null, qrCodeModalProvider: null,
@@ -36,17 +37,15 @@ class ProductBuyPage extends React.Component {
} }
getProduct() { getProduct() {
if (this.state.productName === undefined) { if (this.state.productName === undefined || this.state.organizationName === undefined) {
return; return ;
} }
ProductBackend.getProduct(this.state.organizationName, this.state.productName)
ProductBackend.getProduct(this.props.account.owner, this.state.productName)
.then((res) => { .then((res) => {
if (res.status === "error") { if (res.status === "error") {
Setting.showMessage("error", res.msg); Setting.showMessage("error", res.msg);
return; return;
} }
this.setState({ this.setState({
product: res.data, product: res.data,
}); });
@@ -97,7 +96,7 @@ class ProductBuyPage extends React.Component {
isPlacingOrder: true, isPlacingOrder: true,
}); });
ProductBackend.buyProduct(this.state.product.owner, this.state.productName, provider.name) ProductBackend.buyProduct(product.owner, product.name, provider.name)
.then((res) => { .then((res) => {
if (res.status === "ok") { if (res.status === "ok") {
const payUrl = res.data; const payUrl = res.data;

View File

@@ -295,7 +295,7 @@ class ProductEditPage extends React.Component {
} }
renderPreview() { renderPreview() {
const buyUrl = `/products/${this.state.product.name}/buy`; const buyUrl = `/products/${this.state.product.owner}/${this.state.product.name}/buy`;
return ( return (
<Col span={22} style={{display: "flex", flexDirection: "column"}}> <Col span={22} style={{display: "flex", flexDirection: "column"}}>
<a style={{marginBottom: "10px", display: "flex"}} target="_blank" rel="noreferrer" href={buyUrl}> <a style={{marginBottom: "10px", display: "flex"}} target="_blank" rel="noreferrer" href={buyUrl}>

View File

@@ -102,6 +102,13 @@ class ProductListPage extends BaseListPage {
width: "150px", width: "150px",
sorter: true, sorter: true,
...this.getColumnSearchProps("owner"), ...this.getColumnSearchProps("owner"),
render: (text, record, index) => {
return (
<Link to={`/organizations/${text}`}>
{text}
</Link>
);
},
}, },
{ {
title: i18next.t("general:Created time"), title: i18next.t("general:Created time"),
@@ -189,6 +196,7 @@ class ProductListPage extends BaseListPage {
width: "500px", width: "500px",
...this.getColumnSearchProps("providers"), ...this.getColumnSearchProps("providers"),
render: (text, record, index) => { render: (text, record, index) => {
const providerOwner = record.owner;
const providers = text; const providers = text;
if (providers.length === 0) { if (providers.length === 0) {
return `(${i18next.t("general:empty")})`; return `(${i18next.t("general:empty")})`;
@@ -207,9 +215,9 @@ class ProductListPage extends BaseListPage {
<List.Item> <List.Item>
<div style={{display: "inline"}}> <div style={{display: "inline"}}>
<Tooltip placement="topLeft" title="Edit"> <Tooltip placement="topLeft" title="Edit">
<Button style={{marginRight: "5px"}} icon={<EditOutlined />} size="small" onClick={() => Setting.goToLinkSoft(this, `/providers/${providerName}`)} /> <Button style={{marginRight: "5px"}} icon={<EditOutlined />} size="small" onClick={() => Setting.goToLinkSoft(this, `/providers/${providerOwner}/${providerName}`)} />
</Tooltip> </Tooltip>
<Link to={`/providers/${providerName}`}> <Link to={`/providers/${providerOwner}/${providerName}`}>
{providerName} {providerName}
</Link> </Link>
</div> </div>
@@ -247,7 +255,7 @@ class ProductListPage extends BaseListPage {
render: (text, record, index) => { render: (text, record, index) => {
return ( return (
<div> <div>
<Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} onClick={() => this.props.history.push(`/products/${record.name}/buy`)}>{i18next.t("product:Buy")}</Button> <Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} onClick={() => this.props.history.push(`/products/${record.owner}/${record.name}/buy`)}>{i18next.t("product:Buy")}</Button>
<Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary" onClick={() => this.props.history.push(`/products/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button> <Button style={{marginTop: "10px", marginBottom: "10px", marginRight: "10px"}} type="primary" onClick={() => this.props.history.push(`/products/${record.owner}/${record.name}`)}>{i18next.t("general:Edit")}</Button>
<PopconfirmModal <PopconfirmModal
title={i18next.t("general:Sure to delete") + `: ${record.name} ?`} title={i18next.t("general:Sure to delete") + `: ${record.name} ?`}

View File

@@ -1218,3 +1218,19 @@ export function isDefaultOrganizationSelected(account) {
} }
return false; 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);
}

View File

@@ -103,8 +103,8 @@ export function RemovePolicy(owner, name, policy) {
}).then(res => res.json()); }).then(res => res.json());
} }
export function syncPolicies(owner, name) { export function getPolicies(owner, name) {
return fetch(`${Setting.ServerUrl}/api/sync-policies?id=${owner}/${encodeURIComponent(name)}`, { return fetch(`${Setting.ServerUrl}/api/get-policies?id=${owner}/${encodeURIComponent(name)}`, {
method: "GET", method: "GET",
credentials: "include", credentials: "include",
headers: { headers: {

View File

@@ -77,8 +77,8 @@ export function getLdapUser(owner, name) {
}).then(res => res.json()); }).then(res => res.json());
} }
export function syncUsers(owner, ldapId, body) { export function syncUsers(owner, name, body) {
return fetch(`${Setting.ServerUrl}/api/sync-ldap-users?owner=${owner}&ldapId=${ldapId}`, { return fetch(`${Setting.ServerUrl}/api/sync-ldap-users?id=${owner}/${encodeURIComponent(name)}`, {
method: "POST", method: "POST",
credentials: "include", credentials: "include",
body: JSON.stringify(body), body: JSON.stringify(body),

View File

@@ -79,3 +79,13 @@ export function invoicePayment(owner, name) {
}, },
}).then(res => res.json()); }).then(res => res.json());
} }
export function notifyPayment(owner, name) {
return fetch(`${Setting.ServerUrl}/api/notify-payment/${owner}/${name}`, {
method: "POST",
credentials: "include",
headers: {
"Accept-Language": Setting.getAcceptLanguage(),
},
}).then(res => res.json());
}

View File

@@ -152,6 +152,10 @@
"Sending": "Sendet", "Sending": "Sendet",
"Submit and complete": "Einreichen und abschließen" "Submit and complete": "Einreichen und abschließen"
}, },
"enforcer": {
"Edit Enforcer": "Edit Enforcer",
"New Enforcer": "New Enforcer"
},
"forget": { "forget": {
"Account": "Konto", "Account": "Konto",
"Change Password": "Passwort ändern", "Change Password": "Passwort ändern",
@@ -215,6 +219,7 @@
"Enable": "Enable", "Enable": "Enable",
"Enabled": "Enabled", "Enabled": "Enabled",
"Enabled successfully": "Enabled successfully", "Enabled successfully": "Enabled successfully",
"Enforcers": "Enforcers",
"Failed to add": "Fehler beim hinzufügen", "Failed to add": "Fehler beim hinzufügen",
"Failed to connect to server": "Die Verbindung zum Server konnte nicht hergestellt werden", "Failed to connect to server": "Die Verbindung zum Server konnte nicht hergestellt werden",
"Failed to delete": "Konnte nicht gelöscht werden", "Failed to delete": "Konnte nicht gelöscht werden",

View File

@@ -152,6 +152,10 @@
"Sending": "Sending", "Sending": "Sending",
"Submit and complete": "Submit and complete" "Submit and complete": "Submit and complete"
}, },
"enforcer": {
"Edit Enforcer": "Edit Enforcer",
"New Enforcer": "New Enforcer"
},
"forget": { "forget": {
"Account": "Account", "Account": "Account",
"Change Password": "Change Password", "Change Password": "Change Password",
@@ -215,6 +219,7 @@
"Enable": "Enable", "Enable": "Enable",
"Enabled": "Enabled", "Enabled": "Enabled",
"Enabled successfully": "Enabled successfully", "Enabled successfully": "Enabled successfully",
"Enforcers": "Enforcers",
"Failed to add": "Failed to add", "Failed to add": "Failed to add",
"Failed to connect to server": "Failed to connect to server", "Failed to connect to server": "Failed to connect to server",
"Failed to delete": "Failed to delete", "Failed to delete": "Failed to delete",

View File

@@ -152,6 +152,10 @@
"Sending": "Envío", "Sending": "Envío",
"Submit and complete": "Enviar y completar" "Submit and complete": "Enviar y completar"
}, },
"enforcer": {
"Edit Enforcer": "Edit Enforcer",
"New Enforcer": "New Enforcer"
},
"forget": { "forget": {
"Account": "Cuenta", "Account": "Cuenta",
"Change Password": "Cambiar contraseña", "Change Password": "Cambiar contraseña",
@@ -215,6 +219,7 @@
"Enable": "Enable", "Enable": "Enable",
"Enabled": "Enabled", "Enabled": "Enabled",
"Enabled successfully": "Enabled successfully", "Enabled successfully": "Enabled successfully",
"Enforcers": "Enforcers",
"Failed to add": "No se pudo agregar", "Failed to add": "No se pudo agregar",
"Failed to connect to server": "No se pudo conectar al servidor", "Failed to connect to server": "No se pudo conectar al servidor",
"Failed to delete": "No se pudo eliminar", "Failed to delete": "No se pudo eliminar",

View File

@@ -152,6 +152,10 @@
"Sending": "Envoi", "Sending": "Envoi",
"Submit and complete": "Soumettre et compléter" "Submit and complete": "Soumettre et compléter"
}, },
"enforcer": {
"Edit Enforcer": "Edit Enforcer",
"New Enforcer": "New Enforcer"
},
"forget": { "forget": {
"Account": "Compte", "Account": "Compte",
"Change Password": "Changer le mot de passe", "Change Password": "Changer le mot de passe",
@@ -215,6 +219,7 @@
"Enable": "Enable", "Enable": "Enable",
"Enabled": "Enabled", "Enabled": "Enabled",
"Enabled successfully": "Enabled successfully", "Enabled successfully": "Enabled successfully",
"Enforcers": "Enforcers",
"Failed to add": "Échec d'ajout", "Failed to add": "Échec d'ajout",
"Failed to connect to server": "Échec de la connexion au serveur", "Failed to connect to server": "Échec de la connexion au serveur",
"Failed to delete": "Échec de la suppression", "Failed to delete": "Échec de la suppression",

View File

@@ -152,6 +152,10 @@
"Sending": "Mengirimkan", "Sending": "Mengirimkan",
"Submit and complete": "Kirim dan selesaikan" "Submit and complete": "Kirim dan selesaikan"
}, },
"enforcer": {
"Edit Enforcer": "Edit Enforcer",
"New Enforcer": "New Enforcer"
},
"forget": { "forget": {
"Account": "Akun", "Account": "Akun",
"Change Password": "Ubah Kata Sandi", "Change Password": "Ubah Kata Sandi",
@@ -215,6 +219,7 @@
"Enable": "Enable", "Enable": "Enable",
"Enabled": "Enabled", "Enabled": "Enabled",
"Enabled successfully": "Enabled successfully", "Enabled successfully": "Enabled successfully",
"Enforcers": "Enforcers",
"Failed to add": "Gagal menambahkan", "Failed to add": "Gagal menambahkan",
"Failed to connect to server": "Gagal terhubung ke server", "Failed to connect to server": "Gagal terhubung ke server",
"Failed to delete": "Gagal menghapus", "Failed to delete": "Gagal menghapus",

View File

@@ -152,6 +152,10 @@
"Sending": "送信", "Sending": "送信",
"Submit and complete": "提出して完了してください" "Submit and complete": "提出して完了してください"
}, },
"enforcer": {
"Edit Enforcer": "Edit Enforcer",
"New Enforcer": "New Enforcer"
},
"forget": { "forget": {
"Account": "アカウント", "Account": "アカウント",
"Change Password": "パスワードを変更", "Change Password": "パスワードを変更",
@@ -215,6 +219,7 @@
"Enable": "Enable", "Enable": "Enable",
"Enabled": "Enabled", "Enabled": "Enabled",
"Enabled successfully": "Enabled successfully", "Enabled successfully": "Enabled successfully",
"Enforcers": "Enforcers",
"Failed to add": "追加できませんでした", "Failed to add": "追加できませんでした",
"Failed to connect to server": "サーバーに接続できませんでした", "Failed to connect to server": "サーバーに接続できませんでした",
"Failed to delete": "削除に失敗しました", "Failed to delete": "削除に失敗しました",

View File

@@ -152,6 +152,10 @@
"Sending": "전송하기", "Sending": "전송하기",
"Submit and complete": "제출하고 완료하십시오" "Submit and complete": "제출하고 완료하십시오"
}, },
"enforcer": {
"Edit Enforcer": "Edit Enforcer",
"New Enforcer": "New Enforcer"
},
"forget": { "forget": {
"Account": "계정", "Account": "계정",
"Change Password": "비밀번호 변경", "Change Password": "비밀번호 변경",
@@ -215,6 +219,7 @@
"Enable": "Enable", "Enable": "Enable",
"Enabled": "Enabled", "Enabled": "Enabled",
"Enabled successfully": "Enabled successfully", "Enabled successfully": "Enabled successfully",
"Enforcers": "Enforcers",
"Failed to add": "추가하지 못했습니다", "Failed to add": "추가하지 못했습니다",
"Failed to connect to server": "서버에 연결하지 못했습니다", "Failed to connect to server": "서버에 연결하지 못했습니다",
"Failed to delete": "삭제에 실패했습니다", "Failed to delete": "삭제에 실패했습니다",

View File

@@ -152,6 +152,10 @@
"Sending": "Enviando", "Sending": "Enviando",
"Submit and complete": "Enviar e concluir" "Submit and complete": "Enviar e concluir"
}, },
"enforcer": {
"Edit Enforcer": "Edit Enforcer",
"New Enforcer": "New Enforcer"
},
"forget": { "forget": {
"Account": "Conta", "Account": "Conta",
"Change Password": "Alterar Senha", "Change Password": "Alterar Senha",
@@ -215,6 +219,7 @@
"Enable": "Habilitar", "Enable": "Habilitar",
"Enabled": "Habilitado", "Enabled": "Habilitado",
"Enabled successfully": "Habilitado com sucesso", "Enabled successfully": "Habilitado com sucesso",
"Enforcers": "Enforcers",
"Failed to add": "Falha ao adicionar", "Failed to add": "Falha ao adicionar",
"Failed to connect to server": "Falha ao conectar ao servidor", "Failed to connect to server": "Falha ao conectar ao servidor",
"Failed to delete": "Falha ao excluir", "Failed to delete": "Falha ao excluir",

View File

@@ -152,6 +152,10 @@
"Sending": "Отправка", "Sending": "Отправка",
"Submit and complete": "Отправить и завершить" "Submit and complete": "Отправить и завершить"
}, },
"enforcer": {
"Edit Enforcer": "Edit Enforcer",
"New Enforcer": "New Enforcer"
},
"forget": { "forget": {
"Account": "Счет", "Account": "Счет",
"Change Password": "Изменить пароль", "Change Password": "Изменить пароль",
@@ -215,6 +219,7 @@
"Enable": "Enable", "Enable": "Enable",
"Enabled": "Enabled", "Enabled": "Enabled",
"Enabled successfully": "Enabled successfully", "Enabled successfully": "Enabled successfully",
"Enforcers": "Enforcers",
"Failed to add": "Не удалось добавить", "Failed to add": "Не удалось добавить",
"Failed to connect to server": "Не удалось подключиться к серверу", "Failed to connect to server": "Не удалось подключиться к серверу",
"Failed to delete": "Не удалось удалить", "Failed to delete": "Не удалось удалить",

View File

@@ -152,6 +152,10 @@
"Sending": "Gửi", "Sending": "Gửi",
"Submit and complete": "Nộp và hoàn thành" "Submit and complete": "Nộp và hoàn thành"
}, },
"enforcer": {
"Edit Enforcer": "Edit Enforcer",
"New Enforcer": "New Enforcer"
},
"forget": { "forget": {
"Account": "Tài khoản", "Account": "Tài khoản",
"Change Password": "Đổi mật khẩu", "Change Password": "Đổi mật khẩu",
@@ -215,6 +219,7 @@
"Enable": "Enable", "Enable": "Enable",
"Enabled": "Enabled", "Enabled": "Enabled",
"Enabled successfully": "Enabled successfully", "Enabled successfully": "Enabled successfully",
"Enforcers": "Enforcers",
"Failed to add": "Không thể thêm được", "Failed to add": "Không thể thêm được",
"Failed to connect to server": "Không thể kết nối đến máy chủ", "Failed to connect to server": "Không thể kết nối đến máy chủ",
"Failed to delete": "Không thể xoá", "Failed to delete": "Không thể xoá",

View File

@@ -152,6 +152,10 @@
"Sending": "发送中", "Sending": "发送中",
"Submit and complete": "完成提交" "Submit and complete": "完成提交"
}, },
"enforcer": {
"Edit Enforcer": "Edit Enforcer",
"New Enforcer": "New Enforcer"
},
"forget": { "forget": {
"Account": "账号", "Account": "账号",
"Change Password": "修改密码", "Change Password": "修改密码",
@@ -215,6 +219,7 @@
"Enable": "启用", "Enable": "启用",
"Enabled": "已开启", "Enabled": "已开启",
"Enabled successfully": "启用成功", "Enabled successfully": "启用成功",
"Enforcers": "Enforcers",
"Failed to add": "添加失败", "Failed to add": "添加失败",
"Failed to connect to server": "连接服务器失败", "Failed to connect to server": "连接服务器失败",
"Failed to delete": "删除失败", "Failed to delete": "删除失败",

View File

@@ -102,7 +102,7 @@ class PolicyTable extends React.Component {
synPolicies() { synPolicies() {
this.setState({loading: true}); this.setState({loading: true});
AdapterBackend.syncPolicies(this.props.owner, this.props.name) AdapterBackend.getPolicies(this.props.owner, this.props.name)
.then((res) => { .then((res) => {
if (res.status === "ok") { if (res.status === "ok") {
Setting.showMessage("success", i18next.t("adapter:Sync policies successfully")); Setting.showMessage("success", i18next.t("adapter:Sync policies successfully"));