From 57898da08516ed2de4ef6dffa4e363237bf724a8 Mon Sep 17 00:00:00 2001 From: Qiu Jian Date: Tue, 14 Apr 2020 14:51:28 +0800 Subject: [PATCH] fixes: idp driver validate config support --- pkg/keystone/driver/cas/class.go | 25 +++++++++++++----------- pkg/keystone/driver/driver.go | 2 +- pkg/keystone/driver/ldap/class.go | 7 +++++-- pkg/keystone/driver/sql/class.go | 7 +++++-- pkg/keystone/models/identity_provider.go | 6 ++++-- 5 files changed, 29 insertions(+), 18 deletions(-) diff --git a/pkg/keystone/driver/cas/class.go b/pkg/keystone/driver/cas/class.go index 73b52db71f..9e70fa4b5b 100644 --- a/pkg/keystone/driver/cas/class.go +++ b/pkg/keystone/driver/cas/class.go @@ -15,16 +15,17 @@ package cas import ( + "context" "database/sql" "yunion.io/x/jsonutils" - "yunion.io/x/log" "yunion.io/x/pkg/errors" api "yunion.io/x/onecloud/pkg/apis/identity" "yunion.io/x/onecloud/pkg/httperrors" "yunion.io/x/onecloud/pkg/keystone/driver" "yunion.io/x/onecloud/pkg/keystone/models" + "yunion.io/x/onecloud/pkg/mcclient" ) type SCASDriverClass struct{} @@ -45,36 +46,38 @@ func (self *SCASDriverClass) Name() string { return api.IdentityDriverCAS } -func (self *SCASDriverClass) ValidateConfig(tconf api.TConfigs) error { +func (self *SCASDriverClass) ValidateConfig(ctx context.Context, userCred mcclient.TokenCredential, tconf api.TConfigs) (api.TConfigs, error) { conf := api.SCASIdpConfigOptions{} confJson := jsonutils.Marshal(tconf["cas"]) - log.Debugf("%s %s", tconf, confJson) err := confJson.Unmarshal(&conf) if err != nil { - return errors.Wrap(err, "unmarshal config") + return tconf, errors.Wrap(err, "unmarshal config") } if len(conf.DefaultCasProjectId) > 0 { - _, err := models.ProjectManager.FetchProjectById(conf.DefaultCasProjectId) + obj, err := models.ProjectManager.FetchByIdOrName(userCred, conf.DefaultCasProjectId) if err != nil { if errors.Cause(err) == sql.ErrNoRows { - return errors.Wrapf(httperrors.ErrResourceNotFound, "project %s", conf.DefaultCasProjectId) + return tconf, errors.Wrapf(httperrors.ErrResourceNotFound, "project %s", conf.DefaultCasProjectId) } else { - return errors.Wrap(err, "FetchProjectById") + return tconf, errors.Wrap(err, "FetchProjectById") } } + tconf["cas"]["default_cas_project_id"] = jsonutils.NewString(obj.GetId()) } if len(conf.DefaultCasRoleId) > 0 { - _, err := models.RoleManager.FetchRoleById(conf.DefaultCasRoleId) + obj, err := models.RoleManager.FetchByIdOrName(userCred, conf.DefaultCasRoleId) if err != nil { if errors.Cause(err) == sql.ErrNoRows { - return errors.Wrapf(httperrors.ErrResourceNotFound, "role %s", conf.DefaultCasRoleId) + return tconf, errors.Wrapf(httperrors.ErrResourceNotFound, "role %s", conf.DefaultCasRoleId) } else { - return errors.Wrap(err, "FetchRoleById") + return tconf, errors.Wrap(err, "FetchRoleById") } } + tconf["cas"]["default_cas_role_id"] = jsonutils.NewString(obj.GetId()) } - return nil + + return tconf, nil } func init() { diff --git a/pkg/keystone/driver/driver.go b/pkg/keystone/driver/driver.go index 99aa608c7c..17bc72bc37 100644 --- a/pkg/keystone/driver/driver.go +++ b/pkg/keystone/driver/driver.go @@ -26,7 +26,7 @@ type IIdentityBackendClass interface { SyncMethod() string Name() string NewDriver(idpId, idpName, template, targetDomainId string, autoCreateProject bool, conf api.TConfigs) (IIdentityBackend, error) - ValidateConfig(conf api.TConfigs) error + ValidateConfig(ctx context.Context, userCred mcclient.TokenCredential, conf api.TConfigs) (api.TConfigs, error) } type IIdentityBackend interface { diff --git a/pkg/keystone/driver/ldap/class.go b/pkg/keystone/driver/ldap/class.go index 3181b86262..02e9243ab4 100644 --- a/pkg/keystone/driver/ldap/class.go +++ b/pkg/keystone/driver/ldap/class.go @@ -15,8 +15,11 @@ package ldap import ( + "context" + api "yunion.io/x/onecloud/pkg/apis/identity" "yunion.io/x/onecloud/pkg/keystone/driver" + "yunion.io/x/onecloud/pkg/mcclient" ) type SLDAPDriverClass struct{} @@ -37,8 +40,8 @@ func (self *SLDAPDriverClass) Name() string { return api.IdentityDriverLDAP } -func (self *SLDAPDriverClass) ValidateConfig(conf api.TConfigs) error { - return nil +func (self *SLDAPDriverClass) ValidateConfig(ctx context.Context, userCred mcclient.TokenCredential, conf api.TConfigs) (api.TConfigs, error) { + return conf, nil } func init() { diff --git a/pkg/keystone/driver/sql/class.go b/pkg/keystone/driver/sql/class.go index 0a38f2b4ad..34e14006e9 100644 --- a/pkg/keystone/driver/sql/class.go +++ b/pkg/keystone/driver/sql/class.go @@ -15,8 +15,11 @@ package sql import ( + "context" + api "yunion.io/x/onecloud/pkg/apis/identity" "yunion.io/x/onecloud/pkg/keystone/driver" + "yunion.io/x/onecloud/pkg/mcclient" ) type SSQLDriverClass struct{} @@ -37,8 +40,8 @@ func (self *SSQLDriverClass) Name() string { return api.IdentityDriverSQL } -func (self *SSQLDriverClass) ValidateConfig(conf api.TConfigs) error { - return nil +func (self *SSQLDriverClass) ValidateConfig(ctx context.Context, userCred mcclient.TokenCredential, conf api.TConfigs) (api.TConfigs, error) { + return conf, nil } func init() { diff --git a/pkg/keystone/models/identity_provider.go b/pkg/keystone/models/identity_provider.go index 1170cd9ddb..d5c5419d7d 100644 --- a/pkg/keystone/models/identity_provider.go +++ b/pkg/keystone/models/identity_provider.go @@ -237,7 +237,8 @@ func (ident *SIdentityProvider) PerformConfig(ctx context.Context, userCred mccl return nil, httperrors.NewInvalidStatusError("cannot update config when not idle") } - err := ident.getDriverClass().ValidateConfig(input.Config) + var err error + input.Config, err = ident.getDriverClass().ValidateConfig(ctx, userCred, input.Config) if err != nil { return nil, errors.Wrap(err, "ValidateConfig") } @@ -316,7 +317,8 @@ func (manager *SIdentityProviderManager) ValidateCreateData( input.TargetDomainId = domain.Id } - err := drvCls.ValidateConfig(input.Config) + var err error + input.Config, err = drvCls.ValidateConfig(ctx, userCred, input.Config) if err != nil { return input, errors.Wrap(err, "ValidateConfig") }