Merge pull request #5895 from swordqiu/hotfix/qj-delete-idp-clean-users

fix: delete idp also delete users/groups in target domain
This commit is contained in:
Zexi Li
2020-04-22 10:33:37 +08:00
committed by GitHub
+73 -3
View File
@@ -306,7 +306,7 @@ func (manager *SIdentityProviderManager) ValidateCreateData(
targetDomainStr := input.TargetDomain
if len(targetDomainStr) > 0 {
domain, err := DomainManager.FetchDomainById(targetDomainStr)
domain, err := DomainManager.FetchDomainByIdOrName(targetDomainStr)
if err != nil {
if err == sql.ErrNoRows {
return input, httperrors.NewResourceNotFoundError2(DomainManager.Keyword(), targetDomainStr)
@@ -491,6 +491,10 @@ func (self *SIdentityProvider) GetUserCount() (int, error) {
}
func (self *SIdentityProvider) getNonlocalUserCount() (int, error) {
return self.getNonlocalUserQuery().CountWithError()
}
func (self *SIdentityProvider) getNonlocalUserQuery() *sqlchemy.SQuery {
users := UserManager.Query().SubQuery()
idmaps := IdmappingManager.Query().SubQuery()
@@ -501,7 +505,17 @@ func (self *SIdentityProvider) getNonlocalUserCount() (int, error) {
))
q = q.Filter(sqlchemy.Equals(idmaps.Field("domain_id"), self.Id))
return q.CountWithError()
return q
}
func (self *SIdentityProvider) getNonlocalUsers() ([]SUser, error) {
q := self.getNonlocalUserQuery()
users := make([]SUser, 0)
err := db.FetchModelObjects(UserManager, q, &users)
if err != nil && err != sql.ErrNoRows {
return nil, errors.Wrap(err, "FetchModelObjects")
}
return users, nil
}
func (self *SIdentityProvider) getLocalUserCount() (int, error) {
@@ -519,6 +533,10 @@ func (self *SIdentityProvider) GetGroupCount() (int, error) {
}
func (self *SIdentityProvider) getNonlocalGroupCount() (int, error) {
return self.getNonlocalGroupQuery().CountWithError()
}
func (self *SIdentityProvider) getNonlocalGroupQuery() *sqlchemy.SQuery {
groups := GroupManager.Query().SubQuery()
idmaps := IdmappingManager.Query().SubQuery()
@@ -529,7 +547,17 @@ func (self *SIdentityProvider) getNonlocalGroupCount() (int, error) {
))
q = q.Filter(sqlchemy.Equals(idmaps.Field("domain_id"), self.Id))
return q.CountWithError()
return q
}
func (self *SIdentityProvider) getNonlocalGroups() ([]SGroup, error) {
q := self.getNonlocalGroupQuery()
groups := make([]SGroup, 0)
err := db.FetchModelObjects(GroupManager, q, &groups)
if err != nil && err != sql.ErrNoRows {
return nil, errors.Wrap(err, "FetchModelObjects")
}
return groups, nil
}
func (self *SIdentityProvider) getLocalGroupCount() (int, error) {
@@ -607,6 +635,9 @@ func (self *SIdentityProvider) ValidateDeleteCondition(ctx context.Context) erro
if self.Driver == api.IdentityDriverSQL {
return httperrors.NewForbiddenError("cannot delete default SQL identity provider")
}
if self.Enabled.IsTrue() {
return httperrors.NewInvalidStatusError("cannot delete enabled idp")
}
prjCnt, err := self.GetProjectCount()
if err != nil {
return httperrors.NewGeneralError(err)
@@ -656,6 +687,45 @@ func (ident *SIdentityProvider) deleteConfigs(ctx context.Context, userCred mccl
}
func (self *SIdentityProvider) Purge(ctx context.Context, userCred mcclient.TokenCredential) error {
// delete users
users, err := self.getNonlocalUsers()
if err != nil {
return errors.Wrap(err, "getNonlocalUsers")
}
for i := range users {
err = users[i].UnlinkIdp(self.Id)
if err != nil {
return errors.Wrap(err, "users[i].UnlinkIdp")
}
err = users[i].ValidateDeleteCondition(ctx)
if err != nil {
return errors.Wrap(err, "users[i].ValidateDeleteCondition")
}
err = users[i].Delete(ctx, userCred)
if err != nil {
return errors.Wrap(err, "delete users[i]")
}
}
// delete groups
groups, err := self.getNonlocalGroups()
if err != nil {
return errors.Wrap(err, "getNonlocalGroups")
}
for i := range groups {
err = groups[i].UnlinkIdp(self.Id)
if err != nil {
return errors.Wrap(err, "groups[i].UnlinkIdp")
}
err = groups[i].ValidateDeleteCondition(ctx)
if err != nil {
return errors.Wrap(err, "groups[i].ValidateDeleteCondition")
}
err = groups[i].Delete(ctx, userCred)
if err != nil {
return errors.Wrap(err, "delete groups[i]")
}
}
// delete domains
domains, err := self.getDomains()
if err != nil {
return errors.Wrap(err, "getDomains")