From c68c3f17a29de67945c245ad9951118fc05b338a Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Thu, 25 Feb 2021 02:24:58 +0800 Subject: [PATCH] fix(keystone): ensure comparing id with non-utf8 string --- cmd/climc/shell/identity/identityproviders.go | 1 + pkg/keystone/models/domains.go | 3 +++ pkg/notify/models/receiver.go | 21 ++++++++++--------- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/cmd/climc/shell/identity/identityproviders.go b/cmd/climc/shell/identity/identityproviders.go index 945ea623cb..64c7bcfa70 100644 --- a/cmd/climc/shell/identity/identityproviders.go +++ b/cmd/climc/shell/identity/identityproviders.go @@ -32,6 +32,7 @@ import ( func init() { type IdentityProviderListOptions struct { options.BaseListOptions + SsoDomain string `help:"Filter SSO IDP by domain" json:"sso_domain"` } R(&IdentityProviderListOptions{}, "idp-list", "List all identity provider", func(s *mcclient.ClientSession, args *IdentityProviderListOptions) error { params, err := options.ListStructToParams(args) diff --git a/pkg/keystone/models/domains.go b/pkg/keystone/models/domains.go index 27d012160b..c3bf91d17b 100644 --- a/pkg/keystone/models/domains.go +++ b/pkg/keystone/models/domains.go @@ -150,6 +150,9 @@ func (manager *SDomainManager) FetchDomain(domainId string, domainName string) ( } func (manager *SDomainManager) FetchDomainByIdOrName(domain string) (*SDomain, error) { + if stringutils2.IsUtf8(domain) { + return manager.FetchDomainByName(domain) + } obj, err := db.NewModelObject(manager) if err != nil { return nil, err diff --git a/pkg/notify/models/receiver.go b/pkg/notify/models/receiver.go index 12782eef0d..ba94de2911 100644 --- a/pkg/notify/models/receiver.go +++ b/pkg/notify/models/receiver.go @@ -1063,16 +1063,17 @@ func (rm *SReceiverManager) FetchByIdOrNames(ctx context.Context, idOrNames ...s } var err error q := rm.Query() - if len(idOrNames) == 1 { - q = q.Filter(sqlchemy.OR( - sqlchemy.Equals(q.Field("id"), idOrNames[0]), - sqlchemy.Equals(q.Field("name"), idOrNames[0]), - )) - } else { - q = q.Filter(sqlchemy.OR( - sqlchemy.In(q.Field("id"), idOrNames), - sqlchemy.In(q.Field("name"), idOrNames), - )) + var conds []sqlchemy.ICondition + for _, idOrName := range idOrNames { + conds = append(conds, sqlchemy.Equals(q.Field("name"), idOrName)) + if !stringutils2.IsUtf8(idOrName) { + conds = append(conds, sqlchemy.Equals(q.Field("id"), idOrName)) + } + } + if len(conds) == 1 { + q = q.Filter(conds[0]) + } else if len(conds) > 1 { + q = q.Filter(sqlchemy.OR(conds...)) } receivers := make([]SReceiver, 0, len(idOrNames)) err = db.FetchModelObjects(rm, q, &receivers)