From cb542ae46aa07c2068bf4669a39d1ad993360552 Mon Sep 17 00:00:00 2001
From: XDTD <34300181+XDTD@users.noreply.github.com>
Date: Tue, 9 May 2023 00:06:52 +0800
Subject: [PATCH] feat: fix org admin permissions (#1822)
---
authz/authz.go | 2 +-
controllers/auth.go | 2 +-
controllers/casbin_adapter.go | 7 +++---
controllers/cert.go | 24 +++++++++++++++++++
controllers/message.go | 6 ++---
controllers/syncer.go | 7 +++---
controllers/token.go | 7 +++---
controllers/webhook.go | 7 +++---
object/application.go | 4 ++--
object/casbin_adapter.go | 12 +++++-----
object/cert.go | 39 +++++++++++++++++++++++++++----
object/message.go | 8 +++----
object/syncer.go | 18 ++++++++++----
object/token.go | 12 +++++-----
object/webhook.go | 12 +++++-----
routers/router.go | 1 +
web/src/AdapterEditPage.js | 6 ++---
web/src/AdapterListPage.js | 6 ++---
web/src/App.js | 14 ++++++-----
web/src/ApplicationEditPage.js | 2 +-
web/src/ApplicationListPage.js | 2 +-
web/src/CertEditPage.js | 16 ++++++++++++-
web/src/CertListPage.js | 16 ++++++++++---
web/src/ChatEditPage.js | 2 +-
web/src/ChatPage.js | 4 ++--
web/src/MessageEditPage.js | 2 +-
web/src/MessageListPage.js | 2 +-
web/src/ModelEditPage.js | 4 ++--
web/src/ModelListPage.js | 4 ++--
web/src/PaymentEditPage.js | 2 +-
web/src/PaymentListPage.js | 6 ++---
web/src/PaymentResultPage.js | 2 +-
web/src/PermissionEditPage.js | 2 +-
web/src/ProductBuyPage.js | 2 +-
web/src/ProductEditPage.js | 17 ++++++++++++--
web/src/ProductListPage.js | 12 ++++++++--
web/src/ProviderListPage.js | 5 ++--
web/src/RecordListPage.js | 2 +-
web/src/ResourceListPage.js | 2 +-
web/src/RoleEditPage.js | 2 +-
web/src/SessionListPage.js | 2 +-
web/src/SyncerEditPage.js | 2 +-
web/src/SyncerListPage.js | 4 ++--
web/src/SystemInfo.js | 4 ++--
web/src/TokenEditPage.js | 2 +-
web/src/TokenListPage.js | 4 ++--
web/src/WebhookEditPage.js | 2 +-
web/src/WebhookListPage.js | 4 ++--
web/src/backend/AdapterBackend.js | 4 ++--
web/src/backend/CertBackend.js | 10 ++++++++
web/src/backend/MessageBackend.js | 4 ++--
web/src/backend/SyncerBackend.js | 4 ++--
web/src/backend/TokenBackend.js | 4 ++--
web/src/backend/WebhookBackend.js | 4 ++--
54 files changed, 242 insertions(+), 114 deletions(-)
diff --git a/authz/authz.go b/authz/authz.go
index c2829a1c..328fc8dc 100644
--- a/authz/authz.go
+++ b/authz/authz.go
@@ -151,7 +151,7 @@ func IsAllowed(subOwner string, subName string, method string, urlPath string, o
userId := fmt.Sprintf("%s/%s", subOwner, subName)
user := object.GetUser(userId)
- if user != nil && user.IsAdmin && (subOwner == objOwner || (objOwner == "admin" && subOwner == objName)) {
+ if user != nil && user.IsAdmin && (subOwner == objOwner || (objOwner == "admin")) {
return true
}
diff --git a/controllers/auth.go b/controllers/auth.go
index 89b33663..ba510e6c 100644
--- a/controllers/auth.go
+++ b/controllers/auth.go
@@ -141,7 +141,7 @@ func (c *ApiController) HandleLoggedIn(application *object.Application, user *ob
c.setExpireForSession()
}
- if resp.Status == "ok" && user.Owner == object.CasdoorOrganization && application.Name == object.CasdoorApplication {
+ if resp.Status == "ok" {
object.AddSession(&object.Session{
Owner: user.Owner,
Name: user.Name,
diff --git a/controllers/casbin_adapter.go b/controllers/casbin_adapter.go
index 74b08c3a..75d9c673 100644
--- a/controllers/casbin_adapter.go
+++ b/controllers/casbin_adapter.go
@@ -31,13 +31,14 @@ func (c *ApiController) GetCasbinAdapters() {
value := c.Input().Get("value")
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
+ organization := c.Input().Get("organization")
if limit == "" || page == "" {
- adapters := object.GetCasbinAdapters(owner)
+ adapters := object.GetCasbinAdapters(owner, organization)
c.ResponseOk(adapters)
} else {
limit := util.ParseInt(limit)
- paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetCasbinAdapterCount(owner, field, value)))
- adapters := object.GetPaginationCasbinAdapters(owner, paginator.Offset(), limit, field, value, sortField, sortOrder)
+ paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetCasbinAdapterCount(owner, organization, field, value)))
+ adapters := object.GetPaginationCasbinAdapters(owner, organization, paginator.Offset(), limit, field, value, sortField, sortOrder)
c.ResponseOk(adapters, paginator.Nums())
}
}
diff --git a/controllers/cert.go b/controllers/cert.go
index 92765bf3..64dac054 100644
--- a/controllers/cert.go
+++ b/controllers/cert.go
@@ -48,6 +48,30 @@ func (c *ApiController) GetCerts() {
}
}
+// GetGlobleCerts
+// @Title GetGlobleCerts
+// @Tag Cert API
+// @Description get globle certs
+// @Success 200 {array} object.Cert The Response object
+// @router /get-globle-certs [get]
+func (c *ApiController) GetGlobleCerts() {
+ limit := c.Input().Get("pageSize")
+ page := c.Input().Get("p")
+ field := c.Input().Get("field")
+ value := c.Input().Get("value")
+ sortField := c.Input().Get("sortField")
+ sortOrder := c.Input().Get("sortOrder")
+ if limit == "" || page == "" {
+ c.Data["json"] = object.GetMaskedCerts(object.GetGlobleCerts())
+ c.ServeJSON()
+ } else {
+ limit := util.ParseInt(limit)
+ paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetGlobalCertsCount(field, value)))
+ certs := object.GetMaskedCerts(object.GetPaginationGlobalCerts(paginator.Offset(), limit, field, value, sortField, sortOrder))
+ c.ResponseOk(certs, paginator.Nums())
+ }
+}
+
// GetCert
// @Title GetCert
// @Tag Cert API
diff --git a/controllers/message.go b/controllers/message.go
index 6766df67..86ad1151 100644
--- a/controllers/message.go
+++ b/controllers/message.go
@@ -41,7 +41,7 @@ func (c *ApiController) GetMessages() {
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
chat := c.Input().Get("chat")
-
+ organization := c.Input().Get("organization")
if limit == "" || page == "" {
var messages []*object.Message
if chat == "" {
@@ -54,8 +54,8 @@ func (c *ApiController) GetMessages() {
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
- paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetMessageCount(owner, field, value)))
- messages := object.GetMaskedMessages(object.GetPaginationMessages(owner, paginator.Offset(), limit, field, value, sortField, sortOrder))
+ paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetMessageCount(owner, organization, field, value)))
+ messages := object.GetMaskedMessages(object.GetPaginationMessages(owner, organization, paginator.Offset(), limit, field, value, sortField, sortOrder))
c.ResponseOk(messages, paginator.Nums())
}
}
diff --git a/controllers/syncer.go b/controllers/syncer.go
index 634d72da..009f2fbf 100644
--- a/controllers/syncer.go
+++ b/controllers/syncer.go
@@ -37,13 +37,14 @@ func (c *ApiController) GetSyncers() {
value := c.Input().Get("value")
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
+ organization := c.Input().Get("organization")
if limit == "" || page == "" {
- c.Data["json"] = object.GetSyncers(owner)
+ c.Data["json"] = object.GetOrganizationSyncers(owner, organization)
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
- paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetSyncerCount(owner, field, value)))
- syncers := object.GetPaginationSyncers(owner, paginator.Offset(), limit, field, value, sortField, sortOrder)
+ paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetSyncerCount(owner, organization, field, value)))
+ syncers := object.GetPaginationSyncers(owner, organization, paginator.Offset(), limit, field, value, sortField, sortOrder)
c.ResponseOk(syncers, paginator.Nums())
}
}
diff --git a/controllers/token.go b/controllers/token.go
index 610472cc..d84ea34f 100644
--- a/controllers/token.go
+++ b/controllers/token.go
@@ -39,13 +39,14 @@ func (c *ApiController) GetTokens() {
value := c.Input().Get("value")
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
+ organization := c.Input().Get("organization")
if limit == "" || page == "" {
- c.Data["json"] = object.GetTokens(owner)
+ c.Data["json"] = object.GetTokens(owner, organization)
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
- paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetTokenCount(owner, field, value)))
- tokens := object.GetPaginationTokens(owner, paginator.Offset(), limit, field, value, sortField, sortOrder)
+ paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetTokenCount(owner, organization, field, value)))
+ tokens := object.GetPaginationTokens(owner, organization, paginator.Offset(), limit, field, value, sortField, sortOrder)
c.ResponseOk(tokens, paginator.Nums())
}
}
diff --git a/controllers/webhook.go b/controllers/webhook.go
index ff29c67e..17e43c4a 100644
--- a/controllers/webhook.go
+++ b/controllers/webhook.go
@@ -37,13 +37,14 @@ func (c *ApiController) GetWebhooks() {
value := c.Input().Get("value")
sortField := c.Input().Get("sortField")
sortOrder := c.Input().Get("sortOrder")
+ organization := c.Input().Get("organization")
if limit == "" || page == "" {
- c.Data["json"] = object.GetWebhooks(owner)
+ c.Data["json"] = object.GetWebhooks(owner, organization)
c.ServeJSON()
} else {
limit := util.ParseInt(limit)
- paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetWebhookCount(owner, field, value)))
- webhooks := object.GetPaginationWebhooks(owner, paginator.Offset(), limit, field, value, sortField, sortOrder)
+ paginator := pagination.SetPaginator(c.Ctx, limit, int64(object.GetWebhookCount(owner, organization, field, value)))
+ webhooks := object.GetPaginationWebhooks(owner, organization, paginator.Offset(), limit, field, value, sortField, sortOrder)
c.ResponseOk(webhooks, paginator.Nums())
}
}
diff --git a/object/application.go b/object/application.go
index d420c365..3208137a 100644
--- a/object/application.go
+++ b/object/application.go
@@ -109,7 +109,7 @@ func GetApplications(owner string) []*Application {
func GetOrganizationApplications(owner string, organization string) []*Application {
applications := []*Application{}
- err := adapter.Engine.Desc("created_time").Find(&applications, &Application{Owner: owner, Organization: organization})
+ err := adapter.Engine.Desc("created_time").Find(&applications, &Application{Organization: organization})
if err != nil {
panic(err)
}
@@ -131,7 +131,7 @@ func GetPaginationApplications(owner string, offset, limit int, field, value, so
func GetPaginationOrganizationApplications(owner, organization string, offset, limit int, field, value, sortField, sortOrder string) []*Application {
applications := []*Application{}
session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
- err := session.Find(&applications, &Application{Owner: owner, Organization: organization})
+ err := session.Find(&applications, &Application{Organization: organization})
if err != nil {
panic(err)
}
diff --git a/object/casbin_adapter.go b/object/casbin_adapter.go
index de186728..a391cd44 100644
--- a/object/casbin_adapter.go
+++ b/object/casbin_adapter.go
@@ -46,9 +46,9 @@ type CasbinAdapter struct {
Adapter *xormadapter.Adapter `xorm:"-" json:"-"`
}
-func GetCasbinAdapterCount(owner, field, value string) int {
+func GetCasbinAdapterCount(owner, organization, field, value string) int {
session := GetSession(owner, -1, -1, field, value, "", "")
- count, err := session.Count(&CasbinAdapter{})
+ count, err := session.Count(&CasbinAdapter{Organization: organization})
if err != nil {
panic(err)
}
@@ -56,9 +56,9 @@ func GetCasbinAdapterCount(owner, field, value string) int {
return int(count)
}
-func GetCasbinAdapters(owner string) []*CasbinAdapter {
+func GetCasbinAdapters(owner string, organization string) []*CasbinAdapter {
adapters := []*CasbinAdapter{}
- err := adapter.Engine.Where("owner = ?", owner).Find(&adapters)
+ err := adapter.Engine.Where("owner = ? and organization = ?", owner, organization).Find(&adapters)
if err != nil {
panic(err)
}
@@ -66,10 +66,10 @@ func GetCasbinAdapters(owner string) []*CasbinAdapter {
return adapters
}
-func GetPaginationCasbinAdapters(owner string, page, limit int, field, value, sort, order string) []*CasbinAdapter {
+func GetPaginationCasbinAdapters(owner, organization string, page, limit int, field, value, sort, order string) []*CasbinAdapter {
session := GetSession(owner, page, limit, field, value, sort, order)
adapters := []*CasbinAdapter{}
- err := session.Find(&adapters)
+ err := session.Find(&adapters, &CasbinAdapter{Organization: organization})
if err != nil {
panic(err)
}
diff --git a/object/cert.go b/object/cert.go
index 8bbfc09b..cb01f053 100644
--- a/object/cert.go
+++ b/object/cert.go
@@ -55,8 +55,8 @@ func GetMaskedCerts(certs []*Cert) []*Cert {
}
func GetCertCount(owner, field, value string) int {
- session := GetSession(owner, -1, -1, field, value, "", "")
- count, err := session.Count(&Cert{})
+ session := GetSession("", -1, -1, field, value, "", "")
+ count, err := session.Where("owner = ? or owner = ? ", "admin", owner).Count(&Cert{})
if err != nil {
panic(err)
}
@@ -66,7 +66,7 @@ func GetCertCount(owner, field, value string) int {
func GetCerts(owner string) []*Cert {
certs := []*Cert{}
- err := adapter.Engine.Desc("created_time").Find(&certs, &Cert{Owner: owner})
+ err := adapter.Engine.Where("owner = ? or owner = ? ", "admin", owner).Desc("created_time").Find(&certs, &Cert{})
if err != nil {
panic(err)
}
@@ -76,7 +76,38 @@ func GetCerts(owner string) []*Cert {
func GetPaginationCerts(owner string, offset, limit int, field, value, sortField, sortOrder string) []*Cert {
certs := []*Cert{}
- session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
+ session := GetSession("", offset, limit, field, value, sortField, sortOrder)
+ err := session.Where("owner = ? or owner = ? ", "admin", owner).Find(&certs)
+ if err != nil {
+ panic(err)
+ }
+
+ return certs
+}
+
+func GetGlobalCertsCount(field, value string) int {
+ session := GetSession("", -1, -1, field, value, "", "")
+ count, err := session.Count(&Cert{})
+ if err != nil {
+ panic(err)
+ }
+
+ return int(count)
+}
+
+func GetGlobleCerts() []*Cert {
+ certs := []*Cert{}
+ err := adapter.Engine.Desc("created_time").Find(&certs)
+ if err != nil {
+ panic(err)
+ }
+
+ return certs
+}
+
+func GetPaginationGlobalCerts(offset, limit int, field, value, sortField, sortOrder string) []*Cert {
+ certs := []*Cert{}
+ session := GetSession("", offset, limit, field, value, sortField, sortOrder)
err := session.Find(&certs)
if err != nil {
panic(err)
diff --git a/object/message.go b/object/message.go
index a5fb6b57..84affd8f 100644
--- a/object/message.go
+++ b/object/message.go
@@ -48,9 +48,9 @@ func GetMaskedMessages(messages []*Message) []*Message {
return messages
}
-func GetMessageCount(owner, field, value string) int {
+func GetMessageCount(owner, organization, field, value string) int {
session := GetSession(owner, -1, -1, field, value, "", "")
- count, err := session.Count(&Message{})
+ count, err := session.Count(&Message{Organization: organization})
if err != nil {
panic(err)
}
@@ -78,10 +78,10 @@ func GetChatMessages(chat string) []*Message {
return messages
}
-func GetPaginationMessages(owner string, offset, limit int, field, value, sortField, sortOrder string) []*Message {
+func GetPaginationMessages(owner, organization string, offset, limit int, field, value, sortField, sortOrder string) []*Message {
messages := []*Message{}
session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
- err := session.Find(&messages)
+ err := session.Find(&messages, &Message{Organization: organization})
if err != nil {
panic(err)
}
diff --git a/object/syncer.go b/object/syncer.go
index ba8ec53a..c77c3241 100644
--- a/object/syncer.go
+++ b/object/syncer.go
@@ -55,9 +55,9 @@ type Syncer struct {
Adapter *Adapter `xorm:"-" json:"-"`
}
-func GetSyncerCount(owner, field, value string) int {
+func GetSyncerCount(owner, organization, field, value string) int {
session := GetSession(owner, -1, -1, field, value, "", "")
- count, err := session.Count(&Syncer{})
+ count, err := session.Count(&Syncer{Organization: organization})
if err != nil {
panic(err)
}
@@ -75,10 +75,20 @@ func GetSyncers(owner string) []*Syncer {
return syncers
}
-func GetPaginationSyncers(owner string, offset, limit int, field, value, sortField, sortOrder string) []*Syncer {
+func GetOrganizationSyncers(owner, organization string) []*Syncer {
+ syncers := []*Syncer{}
+ err := adapter.Engine.Desc("created_time").Find(&syncers, &Syncer{Owner: owner, Organization: organization})
+ if err != nil {
+ panic(err)
+ }
+
+ return syncers
+}
+
+func GetPaginationSyncers(owner, organization string, offset, limit int, field, value, sortField, sortOrder string) []*Syncer {
syncers := []*Syncer{}
session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
- err := session.Find(&syncers)
+ err := session.Find(&syncers, &Syncer{Organization: organization})
if err != nil {
panic(err)
}
diff --git a/object/token.go b/object/token.go
index 358280e8..af33f1d4 100644
--- a/object/token.go
+++ b/object/token.go
@@ -91,9 +91,9 @@ type IntrospectionResponse struct {
Jti string `json:"jti,omitempty"`
}
-func GetTokenCount(owner, field, value string) int {
+func GetTokenCount(owner, organization, field, value string) int {
session := GetSession(owner, -1, -1, field, value, "", "")
- count, err := session.Count(&Token{})
+ count, err := session.Count(&Token{Organization: organization})
if err != nil {
panic(err)
}
@@ -101,9 +101,9 @@ func GetTokenCount(owner, field, value string) int {
return int(count)
}
-func GetTokens(owner string) []*Token {
+func GetTokens(owner string, organization string) []*Token {
tokens := []*Token{}
- err := adapter.Engine.Desc("created_time").Find(&tokens, &Token{Owner: owner})
+ err := adapter.Engine.Desc("created_time").Find(&tokens, &Token{Owner: owner, Organization: organization})
if err != nil {
panic(err)
}
@@ -111,10 +111,10 @@ func GetTokens(owner string) []*Token {
return tokens
}
-func GetPaginationTokens(owner string, offset, limit int, field, value, sortField, sortOrder string) []*Token {
+func GetPaginationTokens(owner, organization string, offset, limit int, field, value, sortField, sortOrder string) []*Token {
tokens := []*Token{}
session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
- err := session.Find(&tokens)
+ err := session.Find(&tokens, &Token{Organization: organization})
if err != nil {
panic(err)
}
diff --git a/object/webhook.go b/object/webhook.go
index 4d8c46c3..15f8804d 100644
--- a/object/webhook.go
+++ b/object/webhook.go
@@ -42,9 +42,9 @@ type Webhook struct {
IsEnabled bool `json:"isEnabled"`
}
-func GetWebhookCount(owner, field, value string) int {
+func GetWebhookCount(owner, organization, field, value string) int {
session := GetSession(owner, -1, -1, field, value, "", "")
- count, err := session.Count(&Webhook{})
+ count, err := session.Count(&Webhook{Organization: organization})
if err != nil {
panic(err)
}
@@ -52,9 +52,9 @@ func GetWebhookCount(owner, field, value string) int {
return int(count)
}
-func GetWebhooks(owner string) []*Webhook {
+func GetWebhooks(owner string, organization string) []*Webhook {
webhooks := []*Webhook{}
- err := adapter.Engine.Desc("created_time").Find(&webhooks, &Webhook{Owner: owner})
+ err := adapter.Engine.Desc("created_time").Find(&webhooks, &Webhook{Owner: owner, Organization: organization})
if err != nil {
panic(err)
}
@@ -62,10 +62,10 @@ func GetWebhooks(owner string) []*Webhook {
return webhooks
}
-func GetPaginationWebhooks(owner string, offset, limit int, field, value, sortField, sortOrder string) []*Webhook {
+func GetPaginationWebhooks(owner, organization string, offset, limit int, field, value, sortField, sortOrder string) []*Webhook {
webhooks := []*Webhook{}
session := GetSession(owner, offset, limit, field, value, sortField, sortOrder)
- err := session.Find(&webhooks)
+ err := session.Find(&webhooks, &Webhook{Organization: organization})
if err != nil {
panic(err)
}
diff --git a/routers/router.go b/routers/router.go
index 71259dff..bbc2a7ff 100644
--- a/routers/router.go
+++ b/routers/router.go
@@ -184,6 +184,7 @@ func initAPI() {
beego.Router("/api/run-syncer", &controllers.ApiController{}, "GET:RunSyncer")
beego.Router("/api/get-certs", &controllers.ApiController{}, "GET:GetCerts")
+ beego.Router("/api/get-globle-certs", &controllers.ApiController{}, "GET:GetGlobleCerts")
beego.Router("/api/get-cert", &controllers.ApiController{}, "GET:GetCert")
beego.Router("/api/update-cert", &controllers.ApiController{}, "POST:UpdateCert")
beego.Router("/api/add-cert", &controllers.ApiController{}, "POST:AddCert")
diff --git a/web/src/AdapterEditPage.js b/web/src/AdapterEditPage.js
index 4c66db29..f07f32b6 100644
--- a/web/src/AdapterEditPage.js
+++ b/web/src/AdapterEditPage.js
@@ -47,7 +47,7 @@ class AdapterEditPage extends React.Component {
}
getAdapter() {
- AdapterBackend.getAdapter(this.state.owner, this.state.adapterName)
+ AdapterBackend.getAdapter("admin", this.state.adapterName)
.then((res) => {
if (res.status === "ok") {
this.setState({
@@ -60,7 +60,7 @@ class AdapterEditPage extends React.Component {
}
getOrganizations() {
- OrganizationBackend.getOrganizations("admin")
+ OrganizationBackend.getOrganizations(this.state.organizationName)
.then((res) => {
this.setState({
organizations: (res.msg === undefined) ? res : [],
@@ -109,7 +109,7 @@ class AdapterEditPage extends React.Component {
{Setting.getLabel(i18next.t("general:Organization"), i18next.t("general:Organization - Tooltip"))} :
-