diff --git a/authz/authz.go b/authz/authz.go index 57a44d5f..d25f0879 100644 --- a/authz/authz.go +++ b/authz/authz.go @@ -20,9 +20,9 @@ import ( "github.com/casbin/casbin/v2" "github.com/casbin/casbin/v2/model" - xormadapter "github.com/casbin/xorm-adapter/v3" "github.com/casdoor/casdoor/conf" "github.com/casdoor/casdoor/object" + xormadapter "github.com/casdoor/xorm-adapter/v3" stringadapter "github.com/qiangmzsx/string-adapter/v2" ) diff --git a/controllers/account.go b/controllers/account.go index c4898de0..a75b44f7 100644 --- a/controllers/account.go +++ b/controllers/account.go @@ -254,7 +254,8 @@ func (c *ApiController) Logout() { if accessToken == "" && redirectUri == "" { c.ClearUserSession() - object.DeleteSessionId(user, c.Ctx.Input.CruSession.SessionID()) + // TODO https://github.com/casdoor/casdoor/pull/1494#discussion_r1095675265 + object.DeleteSessionId(util.GetSessionId(object.CasdoorOrganization, object.CasdoorApplication, user), c.Ctx.Input.CruSession.SessionID()) util.LogInfo(c.Ctx, "API: [%s] logged out", user) application := c.GetSessionApplication() @@ -291,7 +292,8 @@ func (c *ApiController) Logout() { } c.ClearUserSession() - object.DeleteSessionId(user, c.Ctx.Input.CruSession.SessionID()) + // TODO https://github.com/casdoor/casdoor/pull/1494#discussion_r1095675265 + object.DeleteSessionId(util.GetSessionId(object.CasdoorOrganization, object.CasdoorApplication, user), c.Ctx.Input.CruSession.SessionID()) util.LogInfo(c.Ctx, "API: [%s] logged out", user) c.Ctx.Redirect(http.StatusFound, fmt.Sprintf("%s?state=%s", strings.TrimRight(redirectUri, "/"), state)) diff --git a/controllers/auth.go b/controllers/auth.go index d0a61a73..b487ca4d 100644 --- a/controllers/auth.go +++ b/controllers/auth.go @@ -139,8 +139,13 @@ func (c *ApiController) HandleLoggedIn(application *object.Application, user *ob }) } - if resp.Status == "ok" { - object.SetSession(user.GetId(), c.Ctx.Input.CruSession.SessionID()) + if resp.Status == "ok" && user.Owner == object.CasdoorOrganization && application.Name == object.CasdoorApplication { + object.AddSession(&object.Session{ + Owner: user.Owner, + Name: user.Name, + Application: application.Name, + SessionId: []string{c.Ctx.Input.CruSession.SessionID()}, + }) } return resp diff --git a/controllers/casbin_adapter.go b/controllers/casbin_adapter.go index dc938a53..74b08c3a 100644 --- a/controllers/casbin_adapter.go +++ b/controllers/casbin_adapter.go @@ -18,9 +18,9 @@ import ( "encoding/json" "github.com/beego/beego/utils/pagination" - xormadapter "github.com/casbin/xorm-adapter/v3" "github.com/casdoor/casdoor/object" "github.com/casdoor/casdoor/util" + xormadapter "github.com/casdoor/xorm-adapter/v3" ) func (c *ApiController) GetCasbinAdapters() { diff --git a/controllers/session.go b/controllers/session.go index 0895c85a..7430ecc6 100644 --- a/controllers/session.go +++ b/controllers/session.go @@ -22,29 +22,10 @@ import ( "github.com/casdoor/casdoor/util" ) -// DeleteSession -// @Title DeleteSession -// @Tag Session API -// @Description Delete session by userId -// @Param id query string true "The id ( owner/name )(owner/name) of user." -// @Success 200 {array} string The Response object -// @router /delete-session [post] -func (c *ApiController) DeleteSession() { - var session object.Session - err := json.Unmarshal(c.Ctx.Input.RequestBody, &session) - if err != nil { - c.ResponseError(err.Error()) - return - } - - c.Data["json"] = wrapActionResponse(object.DeleteSession(util.GetId(session.Owner, session.Name))) - c.ServeJSON() -} - // GetSessions // @Title GetSessions // @Tag Session API -// @Description Get organization user sessions +// @Description Get organization user sessions. // @Param owner query string true "The organization name" // @Success 200 {array} string The Response object // @router /get-sessions [get] @@ -66,3 +47,93 @@ func (c *ApiController) GetSessions() { c.ResponseOk(sessions, paginator.Nums()) } } + +// GetSingleSession +// @Title GetSingleSession +// @Tag Session API +// @Description Get session for one user in one application. +// @Param id query string true "The id(organization/application/user) of session" +// @Success 200 {array} string The Response object +// @router /get-session [get] +func (c *ApiController) GetSingleSession() { + id := c.Input().Get("sessionPkId") + + c.Data["json"] = object.GetSingleSession(id) + c.ServeJSON() +} + +// UpdateSession +// @Title UpdateSession +// @Tag Session API +// @Description Update session for one user in one application. +// @Param id query string true "The id(organization/application/user) of session" +// @Success 200 {array} string The Response object +// @router /update-session [post] +func (c *ApiController) UpdateSession() { + var session object.Session + err := json.Unmarshal(c.Ctx.Input.RequestBody, &session) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.Data["json"] = wrapActionResponse(object.UpdateSession(util.GetSessionId(session.Owner, session.Name, session.Application), &session)) + c.ServeJSON() +} + +// AddSession +// @Title AddSession +// @Tag Session API +// @Description Add session for one user in one application. If there are other existing sessions, join the session into the list. +// @Param id query string true "The id(organization/application/user) of session" +// @Param sessionId query string true "sessionId to be added" +// @Success 200 {array} string The Response object +// @router /add-session [post] +func (c *ApiController) AddSession() { + var session object.Session + err := json.Unmarshal(c.Ctx.Input.RequestBody, &session) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.Data["json"] = wrapActionResponse(object.AddSession(&session)) + c.ServeJSON() +} + +// DeleteSession +// @Title DeleteSession +// @Tag Session API +// @Description Delete session for one user in one application. +// @Param id query string true "The id(organization/application/user) of session" +// @Success 200 {array} string The Response object +// @router /delete-session [post] +func (c *ApiController) DeleteSession() { + var session object.Session + err := json.Unmarshal(c.Ctx.Input.RequestBody, &session) + if err != nil { + c.ResponseError(err.Error()) + return + } + + c.Data["json"] = wrapActionResponse(object.DeleteSession(util.GetSessionId(session.Owner, session.Name, session.Application))) + c.ServeJSON() +} + +// IsSessionDuplicated +// @Title IsSessionDuplicated +// @Tag Session API +// @Description Check if there are other different sessions for one user in one application. +// @Param id query string true "The id(organization/application/user) of session" +// @Param sessionId query string true "sessionId to be checked" +// @Success 200 {array} string The Response object +// @router /is-user-session-duplicated [get] +func (c *ApiController) IsSessionDuplicated() { + id := c.Input().Get("sessionPkId") + sessionId := c.Input().Get("sessionId") + + isUserSessionDuplicated := object.IsSessionDuplicated(id, sessionId) + c.Data["json"] = &Response{Status: "ok", Msg: "", Data: isUserSessionDuplicated} + + c.ServeJSON() +} diff --git a/go.mod b/go.mod index c5b1657b..f0180530 100644 --- a/go.mod +++ b/go.mod @@ -9,10 +9,10 @@ require ( github.com/beego/beego v1.12.11 github.com/beevik/etree v1.1.0 github.com/casbin/casbin/v2 v2.30.1 - github.com/casbin/xorm-adapter/v3 v3.0.1 github.com/casdoor/go-sms-sender v0.5.1 github.com/casdoor/gomail/v2 v2.0.1 github.com/casdoor/oss v1.2.0 + github.com/casdoor/xorm-adapter/v3 v3.0.4 github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f github.com/denisenkom/go-mssqldb v0.9.0 github.com/duo-labs/webauthn v0.0.0-20211221191814-a22482edaa3b @@ -41,6 +41,8 @@ require ( github.com/tealeg/xlsx v1.0.5 github.com/thanhpk/randstr v1.0.4 github.com/tklauser/go-sysconf v0.3.10 // indirect + github.com/xorm-io/core v0.7.4 + github.com/xorm-io/xorm v1.1.6 github.com/yusufpapurcu/wmi v1.2.2 // indirect golang.org/x/crypto v0.0.0-20220214200702-86341886e292 golang.org/x/net v0.0.0-20220127200216-cd36cc0744dd @@ -50,7 +52,4 @@ require ( gopkg.in/square/go-jose.v2 v2.6.0 gopkg.in/yaml.v2 v2.3.0 // indirect modernc.org/sqlite v1.10.1-0.20210314190707-798bbeb9bb84 - xorm.io/builder v0.3.12 // indirect - xorm.io/core v0.7.3 - xorm.io/xorm v1.1.2 ) diff --git a/go.sum b/go.sum index 53b79ceb..0c022c8d 100644 --- a/go.sum +++ b/go.sum @@ -58,7 +58,6 @@ github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= -github.com/PuerkitoBio/goquery v1.5.1/go.mod h1:GsLWisAFVj4WgDibEWF4pvYnkVQBpKBKeU+7zCJoLcc= github.com/RobotsAndPencils/go-saml v0.0.0-20170520135329-fb13cb52a46b h1:EgJ6N2S0h1WfFIjU5/VVHWbMSVYXAluop97Qxpr/lfQ= github.com/RobotsAndPencils/go-saml v0.0.0-20170520135329-fb13cb52a46b/go.mod h1:3SAoF0F5EbcOuBD5WT9nYkbIJieBS84cUQXADbXeBsU= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= @@ -73,7 +72,6 @@ github.com/aliyun/alibaba-cloud-sdk-go v1.61.1075 h1:Z0SzZttfYI/raZ5O9WF3cezZJTS github.com/aliyun/alibaba-cloud-sdk-go v1.61.1075/go.mod h1:pUKYbK5JQ+1Dfxk80P0qxGqe5dkxDoabbZS7zOcouyA= github.com/aliyun/aliyun-oss-go-sdk v2.2.2+incompatible h1:9gWa46nstkJ9miBReJcN8Gq34cBFbzSpQZVVT9N09TM= github.com/aliyun/aliyun-oss-go-sdk v2.2.2+incompatible/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8= -github.com/andybalholm/cascadia v1.1.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= github.com/avast/retry-go v3.0.0+incompatible/go.mod h1:XtSnn+n/sHqQIpZ10K1qAevBhOOCWBLXXy3hyiqqBrY= github.com/aws/aws-sdk-go v1.44.4 h1:ePN0CVJMdiz2vYUcJH96eyxRrtKGSDMgyhP6rah2OgE= github.com/aws/aws-sdk-go v1.44.4/go.mod h1:y4AeaBuwd2Lk+GepC1E9v0qOiTws0MIWAX4oIKwKHZo= @@ -96,14 +94,14 @@ github.com/casbin/casbin/v2 v2.1.0/go.mod h1:YcPU1XXisHhLzuxH9coDNf2FbKpjGlbCg3n github.com/casbin/casbin/v2 v2.28.3/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= github.com/casbin/casbin/v2 v2.30.1 h1:P5HWadDL7olwUXNdcuKUBk+x75Y2eitFxYTcLNKeKF0= github.com/casbin/casbin/v2 v2.30.1/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= -github.com/casbin/xorm-adapter/v3 v3.0.1 h1:0l0zkYxo6cNuIdrBZgFxlje1TRvmheYa/zIp+sGPK58= -github.com/casbin/xorm-adapter/v3 v3.0.1/go.mod h1:1BL7rHEDXrxO+vQdSo/ZaWKRivXl7YTos67GdMYcd20= github.com/casdoor/go-sms-sender v0.5.1 h1:1/Wp1OLkVAVY4lEGQhekSNetSAWhnPcxYPV7xpCZgC0= github.com/casdoor/go-sms-sender v0.5.1/go.mod h1:kBykbqwgRDXbXdMAIxmZKinVM1WjdqEbej5LAbUbcfI= github.com/casdoor/gomail/v2 v2.0.1 h1:J+FG6x80s9e5lBHUn8Sv0Y56mud34KiWih5YdmudR/w= github.com/casdoor/gomail/v2 v2.0.1/go.mod h1:VnGPslEAtpix5FjHisR/WKB1qvZDBaujbikxDe9d+2Q= github.com/casdoor/oss v1.2.0 h1:ozLAE+nnNdFQBWbzH8U9spzaO8h8NrB57lBcdyMUUQ8= github.com/casdoor/oss v1.2.0/go.mod h1:qii35VBuxnR/uEuYSKpS0aJ8htQFOcCVsZ4FHgHLuss= +github.com/casdoor/xorm-adapter/v3 v3.0.4 h1:vB04Ao8n2jA7aFBI9F+gGXo9+Aa1IQP6mTdo50913DM= +github.com/casdoor/xorm-adapter/v3 v3.0.4/go.mod h1:4WTcUw+bTgBylGHeGHzTtBvuTXRS23dtwzFLl9tsgFM= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/cespare/xxhash/v2 v2.1.1 h1:6MnRN8NT7+YBpUIWxHtefFZOKTAPgGjpQSxqLNn0+qY= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -128,7 +126,6 @@ github.com/dchest/captcha v0.0.0-20200903113550-03f5f0333e1f/go.mod h1:QGrK8vMWW github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d h1:1iy2qD6JEhHKKhUOA9IWs7mjco7lnw2qx8FsRI2wirE= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.0-20210816181553-5444fa50b93d/go.mod h1:tmAIfUFEirG/Y8jhZ9M+h36obRZAk/1fcSpXwAVlfqE= -github.com/denisenkom/go-mssqldb v0.0.0-20200428022330-06a60b6afbbc/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/denisenkom/go-mssqldb v0.9.0 h1:RSohk2RsiZqLZ0zCjtfn3S4Gp4exhpBWHyQ7D0yGjAk= github.com/denisenkom/go-mssqldb v0.9.0/go.mod h1:xbL0rPBG9cCiLr28tMa8zpbdarY27NDyej4t/EjAShU= github.com/duo-labs/webauthn v0.0.0-20211221191814-a22482edaa3b h1:L63RATZFZuFMXy6ixnKmv3eNAXwYQF6HW1vd4IYsQqQ= @@ -338,7 +335,6 @@ github.com/mattn/go-ieproxy v0.0.1/go.mod h1:pYabZ6IHcRpFh7vIaLfK7rdcWgFEb3SFJ6/ github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY= github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= -github.com/mattn/go-sqlite3 v1.14.0/go.mod h1:JIl7NbARA7phWnGvh0LKTyg7S9BA+6gx71ShQilpsus= github.com/mattn/go-sqlite3 v1.14.6/go.mod h1:NyWgC/yNuGj7Q9rpYnZvas74GogHl5/Z4A/KQRfk6bU= github.com/mattn/go-sqlite3 v2.0.3+incompatible h1:gXHsfypPkaMZrKbD5209QV9jbUTJKjyR5WD3HYQSd+U= github.com/mattn/go-sqlite3 v2.0.3+incompatible/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= @@ -457,6 +453,12 @@ github.com/volcengine/volc-sdk-golang v1.0.19/go.mod h1:+GGi447k4p1I5PNdbpG2GLaF github.com/wendal/errors v0.0.0-20181209125328-7f31f4b264ec/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= github.com/x448/float16 v0.8.4 h1:qLwI1I70+NjRFUR3zs1JPUCgaCXSh3SW62uAKT1mSBM= github.com/x448/float16 v0.8.4/go.mod h1:14CWIYCyZA/cWjXOioeEpHeN/83MdbZDRQHoFcYsOfg= +github.com/xorm-io/builder v0.3.13 h1:J4oZxt4Gjgm/Si9iKazfzYwHB/ijEOD9EHInyjOSX+M= +github.com/xorm-io/builder v0.3.13/go.mod h1:24o5riRwzre2WvjmN+LM4YpUtJg7W8MdvJ8H57rvrJA= +github.com/xorm-io/core v0.7.4 h1:qIznlqqmYNEb03ewzRXCrNkbbxpkgc/44nVF8yoFV7Y= +github.com/xorm-io/core v0.7.4/go.mod h1:GueyhafDnkB0KK0fXX/dEhr/P1EAGW0GLmoNDUEE1Mo= +github.com/xorm-io/xorm v1.1.6 h1:s4fDpUXJx8Zr/PBovXNaadn+v1P3h/U3iV4OxAkWS8s= +github.com/xorm-io/xorm v1.1.6/go.mod h1:7nsSUdmgLIcqHSSaKOzbVQiZtzIzbpGf1GGSYp6DD70= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -521,7 +523,6 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.2 h1:Gz96sIWK3OalVv/I/qNygP42zyoKp3xptRVCWRFEBvo= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/net v0.0.0-20180218175443-cbe0f9307d01/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -846,12 +847,3 @@ modernc.org/z v1.0.1/go.mod h1:8/SRk5C/HgiQWCgXdfpb+1RvhORdkz5sw72d3jjtyqA= rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8= rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0= rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA= -xorm.io/builder v0.3.7/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= -xorm.io/builder v0.3.8/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= -xorm.io/builder v0.3.12 h1:ASZYX7fQmy+o8UJdhlLHSW57JDOkM8DNhcAF5d0LiJM= -xorm.io/builder v0.3.12/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE= -xorm.io/core v0.7.3 h1:W8ws1PlrnkS1CZU1YWaYLMQcQilwAmQXU0BJDJon+H0= -xorm.io/core v0.7.3/go.mod h1:jJfd0UAEzZ4t87nbQYtVjmqpIODugN6PD2D9E+dJvdM= -xorm.io/xorm v1.0.3/go.mod h1:uF9EtbhODq5kNWxMbnBEj8hRRZnlcNSz2t2N7HW/+A4= -xorm.io/xorm v1.1.2 h1:bje+1KZvK3m5AHtZNfUDlKEEyuw/IRHT+an0CLIG5TU= -xorm.io/xorm v1.1.2/go.mod h1:Cb0DKYTHbyECMaSfgRnIZp5aiUgQozxcJJ0vzcLGJSg= diff --git a/main.go b/main.go index 4db4ef2b..4fbf07e8 100644 --- a/main.go +++ b/main.go @@ -35,7 +35,10 @@ func main() { createDatabase := flag.Bool("createDatabase", false, "true if you need Casdoor to create database") flag.Parse() - object.InitAdapter(*createDatabase) + object.InitAdapter() + object.DoMigration() + object.CreateTables(*createDatabase) + object.InitDb() object.InitFromFile() object.InitDefaultStorageProvider() diff --git a/object/adapter.go b/object/adapter.go index 5c9c8c87..1b63f406 100644 --- a/object/adapter.go +++ b/object/adapter.go @@ -19,15 +19,15 @@ import ( "runtime" "github.com/beego/beego" - xormadapter "github.com/casbin/xorm-adapter/v3" "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 - _ "modernc.org/sqlite" // db = sqlite - "xorm.io/core" - "xorm.io/xorm" + "github.com/xorm-io/core" + "github.com/xorm-io/xorm" + _ "modernc.org/sqlite" // db = sqlite ) var adapter *Adapter @@ -40,12 +40,16 @@ func InitConfig() { beego.BConfig.WebConfig.Session.SessionOn = true - InitAdapter(true) - MigrateDatabase() + InitAdapter() + DoMigration() + CreateTables(true) } -func InitAdapter(createDatabase bool) { +func InitAdapter() { adapter = NewAdapter(conf.GetConfigString("driverName"), conf.GetConfigDataSourceName(), conf.GetConfigString("dbName")) +} + +func CreateTables(createDatabase bool) { if createDatabase { adapter.CreateDatabase() } diff --git a/object/application.go b/object/application.go index 4373480b..d420c365 100644 --- a/object/application.go +++ b/object/application.go @@ -21,7 +21,7 @@ import ( "github.com/casdoor/casdoor/idp" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) type SignupItem struct { diff --git a/object/casbin_adapter.go b/object/casbin_adapter.go index c660a49f..de186728 100644 --- a/object/casbin_adapter.go +++ b/object/casbin_adapter.go @@ -20,9 +20,9 @@ import ( "github.com/casbin/casbin/v2" "github.com/casbin/casbin/v2/model" - xormadapter "github.com/casbin/xorm-adapter/v3" "github.com/casdoor/casdoor/util" - "xorm.io/core" + xormadapter "github.com/casdoor/xorm-adapter/v3" + "github.com/xorm-io/core" ) type CasbinAdapter struct { diff --git a/object/cert.go b/object/cert.go index f24d7b59..8bbfc09b 100644 --- a/object/cert.go +++ b/object/cert.go @@ -18,7 +18,7 @@ import ( "fmt" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) type Cert struct { diff --git a/object/init.go b/object/init.go index b3da536b..6e50a59a 100644 --- a/object/init.go +++ b/object/init.go @@ -34,8 +34,6 @@ func InitDb() { initBuiltInApplication() initBuiltInCert() initBuiltInLdap() - } else { - MigrateDatabase() } initWebAuthn() diff --git a/object/migrator.go b/object/migrator.go new file mode 100644 index 00000000..cfe80506 --- /dev/null +++ b/object/migrator.go @@ -0,0 +1,47 @@ +// Copyright 2023 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 "github.com/xorm-io/xorm/migrate" + +type Migrator interface { + IsMigrationNeeded() bool + DoMigration() *migrate.Migration +} + +func DoMigration() { + migrators := []Migrator{ + &Migrator_1_101_0_PR_1083{}, + &Migrator_1_235_0_PR_1530{}, + &Migrator_1_240_0_PR_1539{}, + // more migrators add here in chronological order... + } + + migrations := []*migrate.Migration{} + + for _, migrator := range migrators { + if migrator.IsMigrationNeeded() { + migrations = append(migrations, migrator.DoMigration()) + } + } + + options := &migrate.Options{ + TableName: "migration", + IDColumnName: "id", + } + + m := migrate.New(adapter.Engine, options, migrations) + m.Migrate() +} diff --git a/object/migrate.go b/object/migrator_1_101_0_PR_1083.go similarity index 63% rename from object/migrate.go rename to object/migrator_1_101_0_PR_1083.go index cdc45601..53319981 100644 --- a/object/migrate.go +++ b/object/migrator_1_101_0_PR_1083.go @@ -10,51 +10,36 @@ // 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 +// limitations under the License. package object import ( "strings" - xormadapter "github.com/casbin/xorm-adapter/v3" - "xorm.io/xorm" - "xorm.io/xorm/migrate" + "github.com/xorm-io/xorm" + "github.com/xorm-io/xorm/migrate" ) -func MigrateDatabase() { - migrations := []*migrate.Migration{ - MigrateCasbinRule(), - MigratePermissionRule(), - } +type Migrator_1_101_0_PR_1083 struct{} - m := migrate.New(adapter.Engine, migrate.DefaultOptions, migrations) - m.Migrate() +func (*Migrator_1_101_0_PR_1083) IsMigrationNeeded() bool { + exist1, _ := adapter.Engine.IsTableExist("model") + exist2, _ := adapter.Engine.IsTableExist("permission") + exist3, _ := adapter.Engine.IsTableExist("permission_rule") + + if exist1 && exist2 && exist3 { + return true + } + return false } -func MigrateCasbinRule() *migrate.Migration { - migration := migrate.Migration{ - ID: "20221015CasbinRule--fill ptype field with p", - Migrate: func(engine *xorm.Engine) error { - _, err := engine.Cols("ptype").Update(&xormadapter.CasbinRule{ - Ptype: "p", - }) - return err - }, - Rollback: func(engine *xorm.Engine) error { - return engine.DropTables(&xormadapter.CasbinRule{}) - }, - } - - return &migration -} - -func MigratePermissionRule() *migrate.Migration { +func (*Migrator_1_101_0_PR_1083) DoMigration() *migrate.Migration { migration := migrate.Migration{ ID: "20230209MigratePermissionRule--Use V5 instead of V1 to store permissionID", Migrate: func(engine *xorm.Engine) error { models := []*Model{} - err := engine.Find(&models, &Model{}) + err := engine.Table("model").Find(&models, &Model{}) if err != nil { panic(err) } diff --git a/object/migrator_1_235_0_PR_1530.go b/object/migrator_1_235_0_PR_1530.go new file mode 100644 index 00000000..ad67b888 --- /dev/null +++ b/object/migrator_1_235_0_PR_1530.go @@ -0,0 +1,49 @@ +// Copyright 2023 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 ( + xormadapter "github.com/casdoor/xorm-adapter/v3" + "github.com/xorm-io/xorm" + "github.com/xorm-io/xorm/migrate" +) + +type Migrator_1_235_0_PR_1530 struct{} + +func (*Migrator_1_235_0_PR_1530) IsMigrationNeeded() bool { + exist, _ := adapter.Engine.IsTableExist("casbin_rule") + + if exist { + return true + } + return false +} + +func (*Migrator_1_235_0_PR_1530) DoMigration() *migrate.Migration { + migration := migrate.Migration{ + ID: "20221015CasbinRule--fill ptype field with p", + Migrate: func(engine *xorm.Engine) error { + _, err := engine.Cols("ptype").Update(&xormadapter.CasbinRule{ + Ptype: "p", + }) + return err + }, + Rollback: func(engine *xorm.Engine) error { + return engine.DropTables(&xormadapter.CasbinRule{}) + }, + } + + return &migration +} diff --git a/object/migrator_1_240_0_PR_1539.go b/object/migrator_1_240_0_PR_1539.go new file mode 100644 index 00000000..7e688171 --- /dev/null +++ b/object/migrator_1_240_0_PR_1539.go @@ -0,0 +1,133 @@ +// Copyright 2023 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 ( + "errors" + + "github.com/xorm-io/xorm" + "github.com/xorm-io/xorm/migrate" +) + +type Migrator_1_240_0_PR_1539 struct{} + +func (*Migrator_1_240_0_PR_1539) IsMigrationNeeded() bool { + exist, _ := adapter.Engine.IsTableExist("session") + err := adapter.Engine.Table("session").Find(&[]*Session{}) + + if exist && err != nil { + return true + } + return false +} + +func (*Migrator_1_240_0_PR_1539) DoMigration() *migrate.Migration { + migration := migrate.Migration{ + ID: "20230211MigrateSession--Create a new field 'application' for table `session`", + Migrate: func(engine *xorm.Engine) error { + if alreadyCreated, _ := engine.IsTableExist("session_tmp"); alreadyCreated { + return errors.New("there is already a table called 'session_tmp', please rename or delete it for casdoor version migration and restart") + } + + type oldSession 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"` + + SessionId []string `json:"sessionId"` + } + + var err error + tx := engine.NewSession() + + defer tx.Close() + + tx.Begin() + + tx.Table("session_tmp").CreateTable(&Session{}) + + oldSessions := []*oldSession{} + newSessions := []*Session{} + + tx.Table("session").Find(&oldSessions) + + for _, oldSession := range oldSessions { + newApplication := "null" + if oldSession.Owner == "built-in" { + newApplication = "app-built-in" + } + newSessions = append(newSessions, &Session{ + Owner: oldSession.Owner, + Name: oldSession.Name, + Application: newApplication, + CreatedTime: oldSession.CreatedTime, + SessionId: oldSession.SessionId, + }) + } + + rollbackFlag := false + _, err = tx.Table("session_tmp").Insert(newSessions) + count1, _ := tx.Table("session_tmp").Count() + count2, _ := tx.Table("session").Count() + + if err != nil || count1 != count2 { + rollbackFlag = true + } + + delete := &Session{ + Application: "null", + } + _, err = tx.Table("session_tmp").Delete(*delete) + if err != nil { + rollbackFlag = true + } + + if rollbackFlag { + tx.DropTable("session_tmp") + return errors.New("there is something wrong with data migration for table `session`, if there is a table called `session_tmp` not created by you in casdoor, please drop it, then restart anyhow") + } + + err = tx.DropTable("session") + if err != nil { + return errors.New("fail to drop table `session` for casdoor, please drop it and rename the table `session_tmp` to `session` manually and restart") + } + + // Already drop table `session` + // Can't find an api from xorm for altering table name + err = tx.Table("session").CreateTable(&Session{}) + if err != nil { + return errors.New("there is something wrong with data migration for table `session`, please restart") + } + + sessions := []*Session{} + tx.Table("session_tmp").Find(&sessions) + _, err = tx.Table("session").Insert(sessions) + if err != nil { + return errors.New("there is something wrong with data migration for table `session`, please drop table `session` and rename table `session_tmp` to `session` and restart") + } + + err = tx.DropTable("session_tmp") + if err != nil { + return errors.New("fail to drop table `session_tmp` for casdoor, please drop it manually and restart") + } + + tx.Commit() + + return nil + }, + } + + return &migration +} diff --git a/object/model.go b/object/model.go index 760d2f0f..43e86680 100644 --- a/object/model.go +++ b/object/model.go @@ -19,7 +19,7 @@ import ( "github.com/casbin/casbin/v2/model" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) type Model struct { diff --git a/object/organization.go b/object/organization.go index 36914dec..ed710f57 100644 --- a/object/organization.go +++ b/object/organization.go @@ -21,7 +21,7 @@ import ( "github.com/casdoor/casdoor/cred" "github.com/casdoor/casdoor/i18n" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) type AccountItem struct { diff --git a/object/payment.go b/object/payment.go index 149d4051..ff90864f 100644 --- a/object/payment.go +++ b/object/payment.go @@ -19,7 +19,7 @@ import ( "net/http" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) type Payment struct { diff --git a/object/permission.go b/object/permission.go index a3ed3683..b5a47c3e 100644 --- a/object/permission.go +++ b/object/permission.go @@ -18,7 +18,7 @@ import ( "fmt" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) type Permission struct { diff --git a/object/permission_enforcer.go b/object/permission_enforcer.go index 4acc74f8..343615de 100644 --- a/object/permission_enforcer.go +++ b/object/permission_enforcer.go @@ -21,8 +21,8 @@ import ( "github.com/casbin/casbin/v2" "github.com/casbin/casbin/v2/config" "github.com/casbin/casbin/v2/model" - xormadapter "github.com/casbin/xorm-adapter/v3" "github.com/casdoor/casdoor/conf" + xormadapter "github.com/casdoor/xorm-adapter/v3" ) func getEnforcer(permission *Permission) *casbin.Enforcer { diff --git a/object/product.go b/object/product.go index 127696f3..d1034adc 100644 --- a/object/product.go +++ b/object/product.go @@ -18,7 +18,7 @@ import ( "fmt" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) type Product struct { diff --git a/object/provider.go b/object/provider.go index d5125585..5009ca42 100644 --- a/object/provider.go +++ b/object/provider.go @@ -20,7 +20,7 @@ import ( "github.com/casdoor/casdoor/i18n" "github.com/casdoor/casdoor/pp" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) type Provider struct { diff --git a/object/resource.go b/object/resource.go index e41c6203..f72dbc10 100644 --- a/object/resource.go +++ b/object/resource.go @@ -18,7 +18,7 @@ import ( "fmt" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) type Resource struct { diff --git a/object/role.go b/object/role.go index f56cabac..01663ce5 100644 --- a/object/role.go +++ b/object/role.go @@ -19,7 +19,7 @@ import ( "strings" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) type Role struct { diff --git a/object/session.go b/object/session.go index 1a56ca17..50a7d8c8 100644 --- a/object/session.go +++ b/object/session.go @@ -17,82 +17,23 @@ package object import ( "github.com/beego/beego" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" +) + +var ( + CasdoorApplication = "app-built-in" + CasdoorOrganization = "built-in" ) type Session struct { Owner string `xorm:"varchar(100) notnull pk" json:"owner"` Name string `xorm:"varchar(100) notnull pk" json:"name"` + Application string `xorm:"varchar(100) notnull pk" json:"application"` CreatedTime string `xorm:"varchar(100)" json:"createdTime"` SessionId []string `json:"sessionId"` } -func SetSession(id string, sessionId string) { - owner, name := util.GetOwnerAndNameFromIdNoCheck(id) - session := &Session{Owner: owner, Name: name} - get, err := adapter.Engine.Get(session) - if err != nil { - panic(err) - } - - session.SessionId = append(session.SessionId, sessionId) - if get { - _, err = adapter.Engine.ID(core.PK{owner, name}).Update(session) - } else { - session.CreatedTime = util.GetCurrentTime() - _, err = adapter.Engine.Insert(session) - } - if err != nil { - panic(err) - } -} - -func DeleteSession(id string) bool { - owner, name := util.GetOwnerAndNameFromIdNoCheck(id) - - session := &Session{Owner: owner, Name: name} - _, err := adapter.Engine.ID(core.PK{owner, name}).Get(session) - if err != nil { - return false - } - - DeleteBeegoSession(session.SessionId) - - affected, err := adapter.Engine.ID(core.PK{owner, name}).Delete(session) - return affected != 0 -} - -func DeleteSessionId(id string, sessionId string) bool { - owner, name := util.GetOwnerAndNameFromId(id) - - session := &Session{Owner: owner, Name: name} - _, err := adapter.Engine.ID(core.PK{owner, name}).Get(session) - if err != nil { - return false - } - - DeleteBeegoSession([]string{sessionId}) - session.SessionId = util.DeleteVal(session.SessionId, sessionId) - - if len(session.SessionId) < 1 { - affected, _ := adapter.Engine.ID(core.PK{owner, name}).Delete(session) - return affected != 0 - } else { - affected, _ := adapter.Engine.ID(core.PK{owner, name}).Update(session) - return affected != 0 - } -} - -func DeleteBeegoSession(sessionIds []string) { - for _, sessionId := range sessionIds { - err := beego.GlobalSessions.GetProvider().SessionDestroy(sessionId) - if err != nil { - return - } - } -} - func GetSessions(owner string) []*Session { sessions := []*Session{} var err error @@ -128,3 +69,128 @@ func GetSessionCount(owner, field, value string) int { return int(count) } + +func GetSingleSession(id string) *Session { + owner, name, application := util.GetOwnerAndNameAndOtherFromId(id) + session := &Session{Owner: owner, Name: name, Application: application} + _, err := adapter.Engine.ID(core.PK{owner, name, application}).Get(session) + if err != nil { + panic(err) + } + + return session +} + +func UpdateSession(id string, session *Session) bool { + owner, name, application := util.GetOwnerAndNameAndOtherFromId(id) + + _, err := adapter.Engine.ID(core.PK{owner, name, application}).Get(session) + if err != nil { + return false + } + + affected, err := adapter.Engine.ID(core.PK{owner, name, application}).Update(session) + if err != nil { + panic(err) + } + + return affected != 0 +} + +func AddSession(session *Session) bool { + owner, name, application := session.Owner, session.Name, session.Application + + dbSession := &Session{Owner: owner, Name: name, Application: application} + get, err := adapter.Engine.ID(core.PK{owner, name, application}).Get(dbSession) + if err != nil { + return false + } + + var affected int64 + var dbErr error + if !get { + session.CreatedTime = util.GetCurrentTime() + affected, dbErr = adapter.Engine.Insert(session) + } else { + m := make(map[string]struct{}) + for _, v := range dbSession.SessionId { + m[v] = struct{}{} + } + for _, v := range session.SessionId { + if _, exists := m[v]; !exists { + dbSession.SessionId = append(dbSession.SessionId, v) + } + } + affected, dbErr = adapter.Engine.ID(core.PK{owner, name, application}).Update(dbSession) + } + if dbErr != nil { + panic(dbErr) + } + return affected != 0 +} + +func DeleteSession(id string) bool { + owner, name, application := util.GetOwnerAndNameAndOtherFromId(id) + + session := &Session{Owner: owner, Name: name, Application: application} + _, err := adapter.Engine.ID(core.PK{owner, name, application}).Get(session) + if err != nil { + return false + } + + if owner == CasdoorOrganization && application == CasdoorApplication { + DeleteBeegoSession(session.SessionId) + } + + affected, err := adapter.Engine.ID(core.PK{owner, name, application}).Delete(session) + return affected != 0 +} + +func DeleteSessionId(id string, sessionId string) bool { + owner, name, application := util.GetOwnerAndNameAndOtherFromId(id) + + session := &Session{Owner: owner, Name: name, Application: application} + _, err := adapter.Engine.ID(core.PK{owner, name, application}).Get(session) + if err != nil { + return false + } + + if owner == CasdoorOrganization && application == CasdoorApplication { + DeleteBeegoSession([]string{sessionId}) + } + session.SessionId = util.DeleteVal(session.SessionId, sessionId) + + if len(session.SessionId) < 1 { + affected, _ := adapter.Engine.ID(core.PK{owner, name, application}).Delete(session) + return affected != 0 + } else { + affected, _ := adapter.Engine.ID(core.PK{owner, name, application}).Update(session) + return affected != 0 + } +} + +func DeleteBeegoSession(sessionIds []string) { + for _, sessionId := range sessionIds { + err := beego.GlobalSessions.GetProvider().SessionDestroy(sessionId) + if err != nil { + return + } + } +} + +func IsSessionDuplicated(id string, sessionId string) bool { + owner, name, application := util.GetOwnerAndNameAndOtherFromId(id) + session := &Session{Owner: owner, Name: name, Application: application} + get, _ := adapter.Engine.ID(core.PK{owner, name, application}).Get(session) + if !get { + return false + } else { + if len(session.SessionId) > 1 { + return true + } else if len(session.SessionId) < 1 { + return false + } else { + return session.SessionId[0] != sessionId + } + } +} diff --git a/object/syncer.go b/object/syncer.go index dcd0de6b..ba8ec53a 100644 --- a/object/syncer.go +++ b/object/syncer.go @@ -18,7 +18,7 @@ import ( "fmt" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) type TableColumn struct { diff --git a/object/syncer_user.go b/object/syncer_user.go index 05d4c4f3..d991157f 100644 --- a/object/syncer_user.go +++ b/object/syncer_user.go @@ -20,7 +20,7 @@ import ( "time" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) type OriginalUser = User diff --git a/object/token.go b/object/token.go index 53cb8191..addb1f8a 100644 --- a/object/token.go +++ b/object/token.go @@ -23,7 +23,7 @@ import ( "github.com/casdoor/casdoor/i18n" "github.com/casdoor/casdoor/idp" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) const ( diff --git a/object/user.go b/object/user.go index 3da60b54..a0a781fa 100644 --- a/object/user.go +++ b/object/user.go @@ -21,7 +21,7 @@ import ( "github.com/casdoor/casdoor/conf" "github.com/casdoor/casdoor/util" "github.com/duo-labs/webauthn/webauthn" - "xorm.io/core" + "github.com/xorm-io/core" ) const ( @@ -578,7 +578,7 @@ func AddUsersInBatch(users []*User) bool { func DeleteUser(user *User) bool { // Forced offline the user first - DeleteSession(user.GetId()) + DeleteSession(util.GetSessionId(user.Owner, user.Name, CasdoorApplication)) affected, err := adapter.Engine.ID(core.PK{user.Owner, user.Name}).Delete(&User{}) if err != nil { diff --git a/object/user_test.go b/object/user_test.go index 760fc23c..66a14c69 100644 --- a/object/user_test.go +++ b/object/user_test.go @@ -21,7 +21,7 @@ import ( "testing" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) func updateUserColumn(column string, user *User) bool { diff --git a/object/user_util.go b/object/user_util.go index 899cc73b..eb09c0b5 100644 --- a/object/user_util.go +++ b/object/user_util.go @@ -20,7 +20,7 @@ import ( "strings" "github.com/casdoor/casdoor/idp" - "xorm.io/core" + "github.com/xorm-io/core" ) func GetUserByField(organizationName string, field string, value string) *User { diff --git a/object/verification.go b/object/verification.go index 5878a00a..0a29b507 100644 --- a/object/verification.go +++ b/object/verification.go @@ -23,7 +23,7 @@ import ( "github.com/casdoor/casdoor/conf" "github.com/casdoor/casdoor/i18n" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) const ( diff --git a/object/webhook.go b/object/webhook.go index f4ee55f9..4d8c46c3 100644 --- a/object/webhook.go +++ b/object/webhook.go @@ -18,7 +18,7 @@ import ( "fmt" "github.com/casdoor/casdoor/util" - "xorm.io/core" + "github.com/xorm-io/core" ) type Header struct { diff --git a/routers/router.go b/routers/router.go index 6f54a9c4..5e22308c 100644 --- a/routers/router.go +++ b/routers/router.go @@ -163,7 +163,11 @@ func initAPI() { beego.Router("/api/add-record", &controllers.ApiController{}, "POST:AddRecord") beego.Router("/api/get-sessions", &controllers.ApiController{}, "GET:GetSessions") + beego.Router("/api/get-session", &controllers.ApiController{}, "GET:GetSingleSession") + beego.Router("/api/update-session", &controllers.ApiController{}, "POST:UpdateSession") + beego.Router("/api/add-session", &controllers.ApiController{}, "POST:AddSession") beego.Router("/api/delete-session", &controllers.ApiController{}, "POST:DeleteSession") + beego.Router("/api/is-session-duplicated", &controllers.ApiController{}, "GET:IsSessionDuplicated") beego.Router("/api/get-webhooks", &controllers.ApiController{}, "GET:GetWebhooks") beego.Router("/api/get-webhook", &controllers.ApiController{}, "GET:GetWebhook") diff --git a/util/string.go b/util/string.go index 9bf7d79f..36dc8cc9 100644 --- a/util/string.go +++ b/util/string.go @@ -100,6 +100,15 @@ func GetOwnerAndNameFromIdNoCheck(id string) (string, string) { return tokens[0], tokens[1] } +func GetOwnerAndNameAndOtherFromId(id string) (string, string, string) { + tokens := strings.Split(id, "/") + if len(tokens) != 3 { + panic(errors.New("GetOwnerAndNameAndOtherFromId() error, wrong token count for ID: " + id)) + } + + return tokens[0], tokens[1], tokens[2] +} + func GenerateId() string { return uuid.NewString() } @@ -127,6 +136,10 @@ func GetId(owner, name string) string { return fmt.Sprintf("%s/%s", owner, name) } +func GetSessionId(owner, name, application string) string { + return fmt.Sprintf("%s/%s/%s", owner, name, application) +} + func GetMd5Hash(text string) string { hash := md5.Sum([]byte(text)) return hex.EncodeToString(hash[:]) diff --git a/util/struct.go b/util/struct.go index 1dbedfc8..132e6f49 100644 --- a/util/struct.go +++ b/util/struct.go @@ -14,7 +14,7 @@ package util -import xormadapter "github.com/casbin/xorm-adapter/v3" +import xormadapter "github.com/casdoor/xorm-adapter/v3" func CasbinToSlice(casbinRule xormadapter.CasbinRule) []string { s := []string{